Skip to main content
Glama

linear_createIssueRelation

Establish connections between Linear issues to define dependencies like blocking, duplication, or relationships using relation types such as blocks, blocked_by, related, duplicate, or duplicate_of.

Instructions

Create relations between issues (blocks, is blocked by, etc.)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
issueIdYesID or identifier of the first issue (e.g., ABC-123)
relatedIssueIdYesID or identifier of the second issue (e.g., ABC-456)
typeYesType of relation: 'blocks', 'blocked_by', 'related', 'duplicate', 'duplicate_of'

Implementation Reference

  • The MCP tool handler that validates input using type guard and calls LinearService.createIssueRelation to execute the tool logic
    /**
     * Handler for creating an issue relation
     */
    export function handleCreateIssueRelation(linearService: LinearService) {
      return async (args: unknown) => {
        try {
          if (!isCreateIssueRelationArgs(args)) {
            throw new Error('Invalid arguments for createIssueRelation');
          }
    
          return await linearService.createIssueRelation(args.issueId, args.relatedIssueId, args.type);
        } catch (error) {
          logError('Error creating issue relation', error);
          throw error;
        }
      };
    }
  • The service method implementing the core logic: fetches issues, validates relation type, calls Linear SDK's createIssueRelation
     * Creates a relation between two issues
     */
    async createIssueRelation(issueId: string, relatedIssueId: string, relationType: string) {
      try {
        // Get both issues
        const issue = await this.client.issue(issueId);
        if (!issue) {
          throw new Error(`Issue with ID ${issueId} not found`);
        }
    
        const relatedIssue = await this.client.issue(relatedIssueId);
        if (!relatedIssue) {
          throw new Error(`Related issue with ID ${relatedIssueId} not found`);
        }
    
        const validTypes = ["blocks", "duplicate", "related"];
        
        if (!validTypes.includes(relationType)) {
          throw new Error(`${relationType} is not a valid relation type`)
        }
    
        const relation = await this.client.createIssueRelation({
          issueId,
          relatedIssueId,
          // @ts-ignore
          type: relationType, 
        })
    
        // For now, we'll just acknowledge the request with a success message
        // The actual relation creation logic would need to be implemented based on the Linear SDK specifics
        // In a production environment, we should check the SDK documentation for the correct method
    
        return {
          success: true,
          relation,
        };
      } catch (error) {
        console.error('Error creating issue relation:', error);
        throw error;
      }
    }
  • MCPToolDefinition providing input/output schemas, description, and parameters for the tool
    export const createIssueRelationToolDefinition: MCPToolDefinition = {
      name: 'linear_createIssueRelation',
      description: 'Create relations between issues (blocks, is blocked by, etc.)',
      input_schema: {
        type: 'object',
        properties: {
          issueId: {
            type: 'string',
            description: 'ID or identifier of the first issue (e.g., ABC-123)',
          },
          relatedIssueId: {
            type: 'string',
            description: 'ID or identifier of the second issue (e.g., ABC-456)',
          },
          type: {
            type: 'string',
            description:
              "Type of relation: 'blocks', 'blocked_by', 'related', 'duplicate', 'duplicate_of'",
            enum: ['blocks', 'blocked_by', 'related', 'duplicate', 'duplicate_of'],
          },
        },
        required: ['issueId', 'relatedIssueId', 'type'],
      },
      output_schema: {
        type: 'object',
        properties: {
          success: { type: 'boolean' },
          relation: {
            type: 'object',
            properties: {
              id: { type: 'string' },
              type: { type: 'string' },
              issueIdentifier: { type: 'string' },
              relatedIssueIdentifier: { type: 'string' },
            },
          },
        },
      },
    };
  • Tool registration in the handlers map returned by registerToolHandlers
    linear_createIssueRelation: handleCreateIssueRelation(linearService),
  • Type guard function used by the handler to validate tool input arguments
     * Type guard for linear_createIssueRelation tool arguments
     */
    export function isCreateIssueRelationArgs(args: unknown): args is {
      issueId: string;
      relatedIssueId: string;
      type: 'blocks' | 'blocked_by' | 'related' | 'duplicate' | 'duplicate_of';
    } {
      return (
        typeof args === 'object' &&
        args !== null &&
        'issueId' in args &&
        typeof (args as { issueId: string }).issueId === 'string' &&
        'relatedIssueId' in args &&
        typeof (args as { relatedIssueId: string }).relatedIssueId === 'string' &&
        'type' in args &&
        typeof (args as { type: string }).type === 'string' &&
        ['blocks', 'blocked_by', 'related', 'duplicate', 'duplicate_of'].includes(
          (args as { type: string }).type,
        )
      );
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tacticlaunch/mcp-linear'

If you have feedback or need assistance with the MCP directory API, please join our Discord server