Skip to content

feat(agent-toolkit): add AI column configuration tools#372

Open
shaygr92 wants to merge 6 commits into
masterfrom
feat/ai-column-tools
Open

feat(agent-toolkit): add AI column configuration tools#372
shaygr92 wants to merge 6 commits into
masterfrom
feat/ai-column-tools

Conversation

@shaygr92
Copy link
Copy Markdown
Collaborator

@shaygr92 shaygr92 commented Jun 2, 2026

Summary

  • Adds configure_ai_column tool — configures any of 8 AI block types (categorize, summarize, translate, improve_text, extract, open_block, write_me, person_assignment) on an existing board column
  • Adds remove_ai_from_column tool — removes AI configuration from a column (deletes automation recipes)
  • Both tools target the AIMS GraphQL subgraph via versionOverride: 'dev'

Design

Single configure_ai_column tool with a block_type discriminator (following the ManageAgentTool pattern) rather than 8 separate tools. Client-side validation for required fields per block type; server-side validation surfaces typed error codes (INVALID_COLUMN_TYPE, SELF_REFERENCING_COLUMN, etc.) directly to the LLM.

Spec: docs/spec-ai-column-tool.md (not included in this PR)

Test plan

  • 27 unit tests covering all block types, conditional validation, error propagation
  • Full test suite passes (1127 tests)
  • Build passes (Rollup CJS + ESM)
  • Manually tested against production board (18409364970): configure, update, remove cycle verified
  • Error handling verified: INVALID_COLUMN_TYPE, INVALID_COLUMN_ID, SELF_REFERENCING_COLUMN, client-side missing field errors

🤖 Generated with Claude Code

shaygr92 and others added 3 commits June 2, 2026 14:13
…n tools

Add two new MCP tools for managing AI columns on monday.com boards:

- configure_ai_column: Configure any of 8 AI block types (categorize,
  summarize, translate, improve_text, extract, open_block, write_me,
  person_assignment) on an existing column. Uses a block_type discriminator
  with conditional field validation.

- remove_ai_from_column: Remove AI configuration from a column, deleting
  all associated automation recipes.

Both tools use versionOverride: 'dev' to target the AIMS GraphQL subgraph.
Includes 27 unit tests covering all block types, validation, and error
propagation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment thread packages/agent-toolkit/src/monday-graphql/schema.dev.graphql
shaygr92 and others added 2 commits June 3, 2026 12:52
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
}

getInputSchema(): RemoveAiFromColumnToolInput {
if (this.context?.boardId) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe our MCP is stateless and context will never have boardId. So imo this execution branch will never be hit. @RomKadria has anything changed? If not maybe we should remove it so that it's not misleading

}

protected async executeInternal(input: ToolInputType<RemoveAiFromColumnToolInput>): Promise<ToolOutputType<never>> {
const boardId = this.context?.boardId ?? (input as ToolInputType<typeof removeAiFromColumnInBoardToolSchema>).board_id;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above, I believe we won't have boardId in context.

source_column_id: z.string().optional().describe(
'The ID of the source column. Required when source_type is "column".',
),
additional_instructions: z.string().optional().describe(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe you can use max() for character limit, same as below

block_type: z.enum(AI_BLOCK_TYPES).describe(
'The AI block type to configure. See tool description for which fields apply to each block.',
),
source_type: z.enum(SOURCE_TYPES).optional().describe(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like a lot of options are required only for specific block_type value? Did you assess if different LLMs are able to handle the complexity of this tool?

… string fields

- Both tools now always require board_id as a direct input (context.boardId
  is never set in the stateless MCP server)
- Added .max(3000) validation to additional_instructions, custom_instructions,
  and ai_query fields

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants