Skip to main content
Glama
useshortcut

Shortcut MCP Server

Official
by useshortcut

stories-add-relation

Connect stories in Shortcut by adding relationships like blocks, duplicates, or relates to between them.

Instructions

Add a story relationship to a story

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
storyPublicIdYesThe public ID of the story
relatedStoryPublicIdYesThe public ID of the related story
relationshipTypeNoThe type of relationshiprelates to

Implementation Reference

  • Tool registration for 'stories-add-relation', including input schema and handler reference.
    server.addToolWithWriteAccess(
    	"stories-add-relation",
    	"Add a story relationship to a story",
    	{
    		storyPublicId: z.number().positive().describe("The public ID of the story"),
    		relatedStoryPublicId: z.number().positive().describe("The public ID of the related story"),
    		relationshipType: z
    			.enum(["relates to", "blocks", "blocked by", "duplicates", "duplicated by"])
    			.optional()
    			.default("relates to")
    			.describe("The type of relationship"),
    	},
    	async (params) => await tools.addRelationToStory(params),
    );
  • The handler function that fetches stories, adjusts relationship direction if needed, calls the client to add the relation, and returns a success message.
    async addRelationToStory({
    	storyPublicId,
    	relatedStoryPublicId,
    	relationshipType,
    }: {
    	storyPublicId: number;
    	relatedStoryPublicId: number;
    	relationshipType: "relates to" | "blocks" | "blocked by" | "duplicates" | "duplicated by";
    }) {
    	if (!storyPublicId) throw new Error("Story public ID is required");
    	if (!relatedStoryPublicId) throw new Error("Related story public ID is required");
    
    	const story = await this.client.getStory(storyPublicId);
    	if (!story)
    		throw new Error(`Failed to retrieve Shortcut story with public ID: ${storyPublicId}`);
    
    	const relatedStory = await this.client.getStory(relatedStoryPublicId);
    	if (!relatedStory)
    		throw new Error(`Failed to retrieve Shortcut story with public ID: ${relatedStoryPublicId}`);
    
    	let subjectStoryId = storyPublicId;
    	let objectStoryId = relatedStoryPublicId;
    
    	if (relationshipType === "blocked by" || relationshipType === "duplicated by") {
    		relationshipType = relationshipType === "blocked by" ? "blocks" : "duplicates";
    		subjectStoryId = relatedStoryPublicId;
    		objectStoryId = storyPublicId;
    	}
    
    	await this.client.addRelationToStory(subjectStoryId, objectStoryId, relationshipType);
    
    	return this.toResult(
    		relationshipType === "blocks"
    			? `Marked sc-${subjectStoryId} as a blocker to sc-${objectStoryId}.`
    			: relationshipType === "duplicates"
    				? `Marked sc-${subjectStoryId} as a duplicate of sc-${objectStoryId}.`
    				: `Added a relationship between sc-${subjectStoryId} and sc-${objectStoryId}.`,
    	);
    }
  • Zod schema defining input parameters for the tool.
    	storyPublicId: z.number().positive().describe("The public ID of the story"),
    	relatedStoryPublicId: z.number().positive().describe("The public ID of the related story"),
    	relationshipType: z
    		.enum(["relates to", "blocks", "blocked by", "duplicates", "duplicated by"])
    		.optional()
    		.default("relates to")
    		.describe("The type of relationship"),
    },

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/useshortcut/mcp-server-shortcut'

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