create_invoice_submission
ChatGPTUse this when the user explicitly asks to create a Constructable invoice submission for an existing commitment and billing period. This creates an invoice submission, line items, and optionally uploads a source PDF; do not use it for read-only invoice questions. Use the exact organization UUID from list_organizations.
describe_mutations
ChatGPTUse this after list_mutations and before running Constructable mutations. Reads mutation implementations and infers the Zod args schema and whether projectId is required. organizationId is required.
describe_tables
ChatGPTUse this after list_tables when you need the columns for specific Constructable data tables. Returns table names and all queryable columns for only the requested tables; it does not return table rows or change Constructable data.
generate_link_for_entity
ChatGPTGenerates a Constructable app link for an entity using the frontend route definitions. Provide the entity type and known ids in the description.
list_mutations
ChatGPTUse this before writing Constructable data. Lists mutation names available for the selected organization and agent context. Use describe_mutations before running a mutation you have not already inspected.
list_organizations
ChatGPTUse this when the user needs to choose or verify which Constructable organizations this MCP client can access. Returns each organization the user may connect, plus whether the connected role has read-only or write-capable MCP permissions.
list_tables
ChatGPTUse this when the user wants to understand which Constructable data tables are available before asking data questions. Use the exact organization UUID from list_organizations. Returns table names only; use describe_tables to inspect columns for specific tables.
run_constructable_data_script
ChatGPTUse this to answer data questions by writing a JavaScript program that runs read-only SQLite SELECT queries against Constructable tables. The program can run multiple queries, loop, join or reshape results, and return a final answer. Use list_tables and describe_tables first when the schema is unknown. Execute code to achieve a goal. Available: type QueryInput = { /* The exact organization UUID from list_organizations organizations[].id. Do not use the organization name, slug, or URL. @format uuid / organizationId: string; /* A read-only SQLite SELECT query using placeholders for dynamic values, for example: SELECT id, name FROM projects LIMIT 25. / queryString: string; /* Optional positional values for query placeholders. / args?: unknown[]; /* The Constructable project id for project-scoped tables, or null for organization-scoped tables. / projectId: string | null; } type QueryOutput = unknown declare const codemode: { /* Use this when the user asks to inspect Constructable project or organization data that is available through the queryable tables. Run only read-only SQLite SELECT queries, use list_tables and describe_tables first when the schema is unknown, include projectId for project-scoped tables, and limit results to 25 rows or fewer. @param input.organizationId - The exact organization UUID from list_organizations organizations[].id. Do not use the organization name, slug, or URL. @param input.queryString - A read-only SQLite SELECT query using placeholders for dynamic values, for example: SELECT id, name FROM projects LIMIT 25. @param input.args - Optional positional values for query placeholders. @param input.projectId - The Constructable project id for project-scoped tables, or null for organization-scoped tables. */ query: (input: QueryInput) => Promise<QueryOutput>; } Write an async arrow function in JavaScript that returns the result. Do NOT use TypeScript syntax — no type annotations, interfaces, or generics. Do NOT define named functions then call them — just write the arrow function body directly. Example: async () => { const r = await codemode.searchWeb({ query: "test" }); return r; }
run_constructable_mutation_script
ChatGPTUse this to write Constructable data by running JavaScript that calls available Constructable mutations. Call list_mutations and describe_mutations first, include organizationId in every mutate call, include projectId when required, and only run mutations after the user has clearly requested the write. Execute code to achieve a goal. Available: type MutateInput = { /* The exact organization UUID from list_organizations organizations[].id. Do not use the organization name, slug, or URL. @format uuid / organizationId: string; /* The exact Constructable mutation class name to run. / mutationName: string; /* The mutation args using camelCase keys. Include ids and timestamps required by the mutation. / args: {}; /* The Constructable project id if the mutation uses project-scoped data. / projectId?: string | null; } type MutateOutput = unknown type GenerateUuidInput = {} type GenerateUuidOutput = { /* @format uuid / id: string; } declare const codemode: { /* Runs one Constructable mutation. Call list_mutations and describe_mutations first, pass the exact organization UUID from list_organizations, and include projectId when describe_mutations says it is required. @param input.organizationId - The exact organization UUID from list_organizations organizations[].id. Do not use the organization name, slug, or URL. @param input.mutationName - The exact Constructable mutation class name to run. @param input.args - The mutation args using camelCase keys. Include ids and timestamps required by the mutation. @param input.projectId - The Constructable project id if the mutation uses project-scoped data. / mutate: (input: MutateInput) => Promise<MutateOutput>; / Generates a UUIDv7 string for new Constructable records. Use this for mutation id fields that create new records. */ generateUuid: (input: GenerateUuidInput) => Promise<GenerateUuidOutput>; } Write an async arrow function in JavaScript that returns the result. Do NOT use TypeScript syntax — no type annotations, interfaces, or generics. Do NOT define named functions then call them — just write the arrow function body directly. Example: async () => { const r = await codemode.searchWeb({ query: "test" }); return r; }
search_project
ChatGPTSearches a Constructable project across indexed content, including drawings, documents, submittals, specs, and other searchable project records. Use full_text mode for keyword matches and semantic mode for meaning-based matches.