Use Symphony's `linear_graphql` client tool for raw Linear GraphQL
operations such as comment editing and upload flows.
Linear GraphQL
Use this skill for raw Linear GraphQL work during Symphony app-server sessions.
Primary tool
Use the linear_graphql client tool exposed by Symphony's app-server session.
It reuses Symphony's configured Linear auth for the session.
Tool input:
{"query":"query or mutation document","variables":{"optional":"graphql variables object"}}
Tool behavior:
Send one GraphQL operation per tool call.
Treat a top-level errors array as a failed GraphQL operation even if the
tool call itself completed.
Keep queries/mutations narrowly scoped; ask only for the fields you need.
Discovering unfamiliar operations
When you need an unfamiliar mutation, input type, or object field, use targeted
introspection through linear_graphql.
List mutation names:
query ListMutations {
__type(name:"Mutation"
fields
name
)
{
{
}
}
}
Inspect a specific input object:
query CommentCreateInputShape {
__type(name:"CommentCreateInput"){
inputFields {
name
type{
kind
name
ofType {
kind
name
}}}}}
Common workflows
Query an issue by key, identifier, or id
Use these progressively:
Start with issue(id: $key) when you have a ticket key such as MT-686.
Fall back to issues(filter: ...) when you need identifier search semantics.
Once you have the internal issue id, prefer issue(id: $id) for narrower reads.
Lookup by issue key:
query IssueByKey($key: String!){
issue(id:$key) {
id
identifier
title
state {
id
name
type}
project {
id
name
}
branchName
url
description
updatedAt
links {
nodes {
id
url
title
}}}}
Lookup by identifier filter:
query IssueByIdentifier($identifier: String!){
issues(filter:{identifier:{eq:$identifier}}, first:1){
nodes {
id
identifier
title
state {
id
name
type}
project {
id
name
}
branchName
url
description
updatedAt
}}}
Resolve a key to an internal id:
query IssueByIdOrKey($id: String!){
issue(id:$id) {
id
identifier
title
}}
Read the issue once the internal id is known:
query IssueDetails($id: String!){
issue(id:$id) {
id
identifier
title
url
description
state {
id
name
type}
project {
id
name
}
attachments {
nodes {
id
title
url
sourceType
}}}}
Query team workflow states for an issue
Use this before changing issue state when you need the exact stateId:
query IssueTeamStates($id: String!){
issue(id:$id) {
id
team {
id
key
name
states {
nodes {
id
name
type}}}}}
Edit an existing comment
Use commentUpdate through linear_graphql:
mutation UpdateComment($id: String!, $body: String!){
commentUpdate(id:$id, input:{body:$body}){
success
comment {
id
body
}}}
mutation MoveIssueToState($id: String!, $stateId: String!){
issueUpdate(id:$id, input:{stateId:$stateId}){
success
issue {
id
identifier
state {
id
name
}}}}
Attach a GitHub PR to an issue
Use the GitHub-specific attachment mutation when linking a PR:
mutation AttachGitHubPR($issueId: String!, $url: String!, $title: String){
attachmentLinkGitHubPR(issueId:$issueIdurl:$urltitle:$titlelinkKind: links
){
success
attachment {
id
title
url
}}}
If you only need a plain URL attachment and do not care about GitHub-specific
link metadata, use:
mutation AttachURL($issueId: String!, $url: String!, $title: String){
attachmentLinkURL(issueId:$issueId, url:$url, title:$title) {
success
attachment {
id
title
url
}}}
Introspection patterns used during schema discovery
Use these when the exact field or mutation shape is unclear:
query QueryFields {
__type(name:"Query"){
fields {
name
}}}
query IssueFieldArgs {
__type(name:"Query"){
fields {
name
args {
name
type{
kind
name
ofType {
kind
name
ofType {
kind
name
}}}}}}}
Upload a video to a comment
Do this in three steps:
Call linear_graphql with fileUpload to get uploadUrl, assetUrl, and
any required upload headers.
Upload the local file bytes to uploadUrl with curl -X PUT and the exact
headers returned by fileUpload.
Call linear_graphql again with commentCreate (or commentUpdate) and
include the resulting assetUrl in the comment body.