Skip to main content
Glama
jhliberty

Basecamp MCP Server

by jhliberty

complete_card_step

Mark a specific step within a Basecamp project card as complete using project and step IDs, streamlining task management and progress tracking.

Instructions

Mark a card step as complete

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
project_idYesThe project ID
step_idYesThe step ID

Implementation Reference

  • Core handler function that executes the API POST request to the Basecamp endpoint to complete a card step.
    async completeCardStep(projectId: string, stepId: string): Promise<any> {
      const response = await this.client.post(`/buckets/${projectId}/todos/${stepId}/completion.json`);
      return response.data;
    }
  • MCP server handler case that calls the BasecampClient method and formats the MCP response.
    case 'complete_card_step': {
      await client.completeCardStep(typedArgs.project_id, typedArgs.step_id);
      return {
        content: [{
          type: 'text',
          text: JSON.stringify({
            status: 'success',
            message: 'Step marked as complete'
          }, null, 2)
        }]
      };
    }
  • Input schema definition for the complete_card_step tool, specifying required project_id and step_id parameters.
    {
      name: 'complete_card_step',
      description: 'Mark a card step as complete',
      inputSchema: {
        type: 'object',
        properties: {
          project_id: { type: 'string', description: 'The project ID' },
          step_id: { type: 'string', description: 'The step ID' },
        },
        required: ['project_id', 'step_id'],
      },
    },
  • src/index.ts:105-539 (registration)
    The complete_card_step tool is registered here in the listTools response handler, making it available to MCP clients.
    return {
      tools: [
        // Core tools
        {
          name: 'get_projects',
          description: 'Get all Basecamp projects',
          inputSchema: {
            type: 'object',
            properties: {},
          },
        },
        {
          name: 'get_project',
          description: 'Get details for a specific project',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
            },
            required: ['project_id'],
          },
        },
        {
          name: 'search_basecamp',
          description: 'Search across Basecamp projects, todos, and messages',
          inputSchema: {
            type: 'object',
            properties: {
              query: { type: 'string', description: 'Search query' },
              project_id: { type: 'string', description: 'Optional project ID to limit search scope' },
            },
            required: ['query'],
          },
        },
        {
          name: 'global_search',
          description: 'Search projects, todos and campfire messages across all projects',
          inputSchema: {
            type: 'object',
            properties: {
              query: { type: 'string', description: 'Search query' },
            },
            required: ['query'],
          },
        },
    
        // Todo tools
        {
          name: 'get_todolists',
          description: 'Get todo lists for a project',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
            },
            required: ['project_id'],
          },
        },
        {
          name: 'get_todos',
          description: 'Get todos from a todo list',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              todolist_id: { type: 'string', description: 'The todo list ID' },
            },
            required: ['project_id', 'todolist_id'],
          },
        },
    
        // Card Table tools
        {
          name: 'get_card_table',
          description: 'Get the card table details for a project',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
            },
            required: ['project_id'],
          },
        },
        {
          name: 'get_columns',
          description: 'Get all columns in a card table',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_table_id: { type: 'string', description: 'The card table ID' },
            },
            required: ['project_id', 'card_table_id'],
          },
        },
        {
          name: 'get_cards',
          description: 'Get all cards in a column',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              column_id: { type: 'string', description: 'The column ID' },
            },
            required: ['project_id', 'column_id'],
          },
        },
        {
          name: 'create_card',
          description: 'Create a new card in a column',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              column_id: { type: 'string', description: 'The column ID' },
              title: { type: 'string', description: 'The card title' },
              content: { type: 'string', description: 'Optional card content/description' },
              due_on: { type: 'string', description: 'Optional due date (ISO 8601 format)' },
              notify: { type: 'boolean', description: 'Whether to notify assignees (default: false)' },
            },
            required: ['project_id', 'column_id', 'title'],
          },
        },
    
        // Column Management tools
        {
          name: 'create_column',
          description: 'Create a new column in a card table',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_table_id: { type: 'string', description: 'The card table ID' },
              title: { type: 'string', description: 'The column title' },
            },
            required: ['project_id', 'card_table_id', 'title'],
          },
        },
        {
          name: 'update_column',
          description: 'Update a column title',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              column_id: { type: 'string', description: 'The column ID' },
              title: { type: 'string', description: 'The new column title' },
            },
            required: ['project_id', 'column_id', 'title'],
          },
        },
        {
          name: 'move_column',
          description: 'Move a column to a new position',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_table_id: { type: 'string', description: 'The card table ID' },
              column_id: { type: 'string', description: 'The column ID' },
              position: { type: 'number', description: 'The new 1-based position' },
            },
            required: ['project_id', 'card_table_id', 'column_id', 'position'],
          },
        },
        {
          name: 'update_column_color',
          description: 'Update a column color',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              column_id: { type: 'string', description: 'The column ID' },
              color: { type: 'string', description: 'The hex color code (e.g., #FF0000)' },
            },
            required: ['project_id', 'column_id', 'color'],
          },
        },
    
        // Card Management tools
        {
          name: 'get_card',
          description: 'Get details for a specific card',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_id: { type: 'string', description: 'The card ID' },
            },
            required: ['project_id', 'card_id'],
          },
        },
        {
          name: 'update_card',
          description: 'Update a card',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_id: { type: 'string', description: 'The card ID' },
              title: { type: 'string', description: 'The new card title' },
              content: { type: 'string', description: 'The new card content/description' },
              due_on: { type: 'string', description: 'Due date (ISO 8601 format)' },
              assignee_ids: { type: 'array', items: { type: 'string' }, description: 'Array of person IDs to assign to the card' },
            },
            required: ['project_id', 'card_id'],
          },
        },
        {
          name: 'move_card',
          description: 'Move a card to a new column',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_id: { type: 'string', description: 'The card ID' },
              column_id: { type: 'string', description: 'The destination column ID' },
            },
            required: ['project_id', 'card_id', 'column_id'],
          },
        },
        {
          name: 'complete_card',
          description: 'Mark a card as complete',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_id: { type: 'string', description: 'The card ID' },
            },
            required: ['project_id', 'card_id'],
          },
        },
    
        // Card Steps tools
        {
          name: 'get_card_steps',
          description: 'Get all steps (sub-tasks) for a card',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_id: { type: 'string', description: 'The card ID' },
            },
            required: ['project_id', 'card_id'],
          },
        },
        {
          name: 'create_card_step',
          description: 'Create a new step (sub-task) for a card',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              card_id: { type: 'string', description: 'The card ID' },
              title: { type: 'string', description: 'The step title' },
              due_on: { type: 'string', description: 'Optional due date (ISO 8601 format)' },
              assignee_ids: { type: 'array', items: { type: 'string' }, description: 'Array of person IDs to assign to the step' },
            },
            required: ['project_id', 'card_id', 'title'],
          },
        },
        {
          name: 'complete_card_step',
          description: 'Mark a card step as complete',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              step_id: { type: 'string', description: 'The step ID' },
            },
            required: ['project_id', 'step_id'],
          },
        },
    
        // Communication tools
        {
          name: 'get_campfire_lines',
          description: 'Get recent messages from a Basecamp campfire (chat room)',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              campfire_id: { type: 'string', description: 'The campfire/chat room ID' },
            },
            required: ['project_id', 'campfire_id'],
          },
        },
        {
          name: 'get_comments',
          description: 'Get comments for a Basecamp item',
          inputSchema: {
            type: 'object',
            properties: {
              recording_id: { type: 'string', description: 'The item ID' },
              project_id: { type: 'string', description: 'The project ID' },
            },
            required: ['recording_id', 'project_id'],
          },
        },
    
        // Document tools
        {
          name: 'get_documents',
          description: 'List documents in a vault',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              vault_id: { type: 'string', description: 'Vault ID' },
            },
            required: ['project_id', 'vault_id'],
          },
        },
        {
          name: 'create_document',
          description: 'Create a document in a vault',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              vault_id: { type: 'string', description: 'Vault ID' },
              title: { type: 'string', description: 'Document title' },
              content: { type: 'string', description: 'Document HTML content' },
            },
            required: ['project_id', 'vault_id', 'title', 'content'],
          },
        },
        {
          name: 'update_document',
          description: 'Update a document',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              document_id: { type: 'string', description: 'Document ID' },
              title: { type: 'string', description: 'New title' },
              content: { type: 'string', description: 'New HTML content' },
            },
            required: ['project_id', 'document_id'],
          },
        },
        {
          name: 'trash_document',
          description: 'Move a document to trash',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              document_id: { type: 'string', description: 'Document ID' },
            },
            required: ['project_id', 'document_id'],
          },
        },
    
        // File tools
        {
          name: 'get_uploads',
          description: 'List uploads in a project or vault',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              vault_id: { type: 'string', description: 'Optional vault ID to limit to specific vault' },
            },
            required: ['project_id'],
          },
        },
    
        // Webhook tools
        {
          name: 'get_webhooks',
          description: 'List webhooks for a project',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
            },
            required: ['project_id'],
          },
        },
        {
          name: 'create_webhook',
          description: 'Create a webhook',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              payload_url: { type: 'string', description: 'Payload URL' },
              types: { type: 'array', items: { type: 'string' }, description: 'Event types' },
            },
            required: ['project_id', 'payload_url'],
          },
        },
        {
          name: 'delete_webhook',
          description: 'Delete a webhook',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'Project ID' },
              webhook_id: { type: 'string', description: 'Webhook ID' },
            },
            required: ['project_id', 'webhook_id'],
          },
        },
    
        // Check-in tools
        {
          name: 'get_daily_check_ins',
          description: "Get project's daily checking questionnaire",
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              page: { type: 'number', description: 'Page number for paginated response' },
            },
            required: ['project_id'],
          },
        },
        {
          name: 'get_question_answers',
          description: 'Get answers on daily check-in question',
          inputSchema: {
            type: 'object',
            properties: {
              project_id: { type: 'string', description: 'The project ID' },
              question_id: { type: 'string', description: 'The question ID' },
              page: { type: 'number', description: 'Page number for paginated response' },
            },
            required: ['project_id', 'question_id'],
          },
        },
      ],
    };

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/jhliberty/basecamp-mcp-server'

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