@mondaydotcomorg/agent-toolkit 2.9.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/core/index.js +1 -1
- package/dist/cjs/core/index.js.map +1 -1
- package/dist/cjs/mcp/index.js +1 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/openai/index.js +1 -1
- package/dist/cjs/openai/index.js.map +1 -1
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/mcp/index.js +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/openai/index.js +1 -1
- package/dist/esm/openai/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/core/index.js
CHANGED
|
@@ -611,5 +611,5 @@
|
|
|
611
611
|
}
|
|
612
612
|
}
|
|
613
613
|
}
|
|
614
|
-
`),i=await this.mondayApi.request(t);if(!i.__type)return{content:`Type '${e.typeName}' not found in the GraphQL schema. Please check the type name and try again.`};let n=`## Type: ${i.__type.name||"Unnamed"} ${e.typeName===i.__type.name?"":`(queried: ${e.typeName})`}\nKind: ${i.__type.kind}\n${i.__type.description?`Description: ${i.__type.description}`:""}\n\n`;return i.__type.fields&&i.__type.fields.length>0&&(n+="## Fields\n",i.__type.fields.forEach((e=>{const a=$x(e.type);n+=`- ${e.name}: ${a}${e.description?` - ${e.description}`:""}\n`,e.args&&e.args.length>0&&(n+=" Arguments:\n",e.args.forEach((e=>{const a=$x(e.type);n+=` - ${e.name}: ${a}${e.description?` - ${e.description}`:""}${e.defaultValue?` (default: ${e.defaultValue})`:""}\n`})))})),n+="\n"),i.__type.inputFields&&i.__type.inputFields.length>0&&(n+="## Input Fields\n",i.__type.inputFields.forEach((e=>{const a=$x(e.type);n+=`- ${e.name}: ${a}${e.description?` - ${e.description}`:""}${e.defaultValue?` (default: ${e.defaultValue})`:""}\n`})),n+="\n"),i.__type.interfaces&&i.__type.interfaces.length>0&&(n+="## Implements\n",i.__type.interfaces.forEach((e=>{n+=`- ${e.name}\n`})),n+="\n"),i.__type.enumValues&&i.__type.enumValues.length>0&&(n+="## Enum Values\n",i.__type.enumValues.forEach((e=>{n+=`- ${e.name}${e.description?` - ${e.description}`:""}\n`})),n+="\n"),i.__type.possibleTypes&&i.__type.possibleTypes.length>0&&(n+="## Possible Types\n",i.__type.possibleTypes.forEach((e=>{n+=`- ${e.name}\n`}))),n+=`\n## Usage Examples\nIf this is a Query or Mutation field, you can use it in the all_monday_api tool.\n\nExample for query:\nall_monday_api(operation: "query", name: "getTypeData", variables: "{\\"typeName\\": \\"${i.__type.name}\\"}")\n\nExample for object field access:\nWhen querying objects that have this type, include these fields in your query.\n`,{content:n}}catch(e){const a=e instanceof Error?e.message:"Unknown error",t=a.includes("JSON");return{content:`Error fetching type details: ${a}${t?"\n\nThis could be because the type name is incorrect or the GraphQL query format is invalid. Please check the type name and try again.":""}`}}var a}},class extends Zm{constructor(){super(...arguments),this.name="create_custom_activity",this.type=exports.ToolType.WRITE,this.annotations=Qm({title:"Create Custom Activity",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1})}getDescription(){return"Create a new custom activity in the E&A app"}getInputSchema(){return bx}async executeInternal(e){const a={color:e.color,icon_id:e.icon_id,name:e.name};return await this.mondayApi.request(ax,a),{content:`Custom activity '${e.name}' with color ${e.color} and icon ${e.icon_id} successfully created`}}},class extends Zm{constructor(){super(...arguments),this.name="create_timeline_item",this.type=exports.ToolType.WRITE,this.annotations=Qm({title:"Create Timeline Item",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1})}getDescription(){return"Create a new timeline item in the E&A app"}getInputSchema(){return wx}async executeInternal(e){const a={item_id:e.item_id.toString(),custom_activity_id:e.custom_activity_id,title:e.title,timestamp:e.timestamp,summary:e.summary,content:e.content,location:e.location,phone:e.phone,url:e.url};e.start_timestamp&&e.end_timestamp&&(a.time_range={start_timestamp:e.start_timestamp,end_timestamp:e.end_timestamp});const t=await this.mondayApi.request(tx,a);return{content:`Timeline item '${e.title}' with ID ${t.create_timeline_item?.id} successfully created on item ${e.item_id}`}}},class extends Zm{constructor(){super(...arguments),this.name="fetch_custom_activity",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Fetch Custom Activities",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"Get custom activities from the E&A app"}getInputSchema(){return Sx}async executeInternal(e){const a=await this.mondayApi.request(ix);if(!a.custom_activity||0===a.custom_activity.length)return{content:"No custom activities found"};const t=a.custom_activity.map((e=>({id:e.id,name:e.name,color:e.color,icon_id:e.icon_id,type:e.type})));return{content:`Found ${t.length} custom activities: ${JSON.stringify(t,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="create_workflow_instructions",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Create Workflow Instructions"})}getDescription(){return'When the user asks to create a workflow or automation, you must use this tool, which provides instructions on how to create a workflow.\n This tool is very important and should be used when the user explicitly requests:\n - Workflow creation (e.g., "create a monday workflow", "create a new workflow").\n - Automation (e.g., "automate this process", "when item is created, set status to done")\n '}getInputSchema(){return{}}async executeInternal(){return{content:'\n# Instructions to Create a Live Workflow\n\n## General Explanation:\n- A workflow is a structured sequence of actions and conditions and triggers (blocks) designed to automate processes (for example, trigger -> action -> action -> ...).\n- A block is a reusable logic unit; it can be a trigger, condition or action. It has input fields and output fields.\n- A workflow block wraps a block (the underlying logic unit), providing the configuration for its input fields and defining how it connects to other blocks in the workflow graph.\n- A workflow variable presents a value that is used in the workflow block. It has a unique key, a value, and dependencies.\nIt can be a result of a previous block, a user config, a reference, or a host metadata.\nIf it is a user config, you have to get the possible values for the value from remote options query.\n\nTo create a live workflow in monday.com, follow these steps:\n\n## Step 0: Determine and Ensure Host Exists (CRITICAL FIRST STEP)\n\n**Every workflow MUST be attached to an existing host entity.** Before creating any workflow, you must:\n\n### 0.1 Identify the Host Type Based on User Request\n\n**IMPORTANT: The host type depends on what the user is asking for:**\n\n- **If user wants "monday workflows"** (e.g., "create a monday workflow") ALWAYS USE THIS HOST TYPE:\n - Host type: **APP_FEATURE_OBJECT** \n - This is the standalone Workflows product\n - User explicitly mentions "monday workflow" or "workflow" without board context\n \n- **If user wants "automation"** (e.g., "automate when item is created", "set status automatically"):\n - Host type: **BOARD**\n - The automation will run on a specific board\n - User typically mentions board-related triggers/actions and the workflow is pretty simple\n\n### 0.2 Check if Host Exists\n**Always check first before creating:**\n\n**For BOARD hosts (automations):**\n```\nquery {\n boards(ids: [BOARD_ID]) {\n id\n name\n }\n}\n```\nIf user didn\'t specify a board, you may need to ask which board or list available boards.\n\n**For APP_FEATURE_OBJECT hosts (monday workflows):**\nCheck if a workflows object exists for the user/workspace. The exact query depends on the API structure for workflows objects.\n\n### 0.3 Create Host if Missing\n**Only if the host doesn\'t exist, create it first:**\n\n**For BOARD hosts:**\n```\nmutation {\n create_board(\n board_name: "Board Name",\n board_kind: public\n ) {\n id\n }\n}\n```\n\n**For APP_FEATURE_OBJECT hosts:**\n```\nmutation {\n create_workflows_object(\n name: "Workflow Name"\n ) {\n id\n }\n}\n```\n\n### 0.4 Prepare workflowHostData\nOnce you have confirmed the host exists (or created it), prepare the `workflowHostData` object:\n\n**For automations (board host):**\n```\nworkflowHostData: {\n id: "BOARD_ID_HERE",\n type: BOARD\n}\n```\n\n**For monday workflows (app feature host):**\n```\nworkflowHostData: {\n id: "WORKFLOWS_OBJECT_ID_HERE",\n type: APP_FEATURE_OBJECT\n}\n```\n\n**⚠️ IMPORTANT: Do not proceed to the next steps until the host is confirmed to exist and you have its ID.**\n\n## Step 1: Fetch Available Blocks\n\nFetch the blocks including the input fields config using monday api:\nEach block represents a trigger, condition or action. Blocks can have input fields and output fields.\nIn general, you can understand what a block does by its description or name.\nThe "kind" field in the block represents the type of the block (trigger, condition or action).\nThere are some types of input fields: In the case of CustomInputField, it refers to a field type feature. \nIt has special functionality — for example, remote options. These are all the possible values for this type. \nFor example, if the field type is \'board\', then the options will include a list of all boardIds \nTheir identifier is the \'fieldTypeReferenceId\' (or \'id\' in the fieldTypeData).\nThere are dependencies that tell us what values we need to know to fetch the options for the custom input field\'s value.\nFor example, if the custom input field is a status column, the dependency is the board ID.\n\n**Example query to fetch the blocks:**\n```\nquery {\n blocks {\n blocks {\n id\n description\n name\n kind\n inputFieldsConfig {\n fieldTitle\n fieldKey\n ... on CustomInputFieldConfig {\n fieldTypeReferenceId\n fieldTypeUniqueKey\n fieldTypeData {\n id\n dependencyConfig{\n optionalFields{\n sourceFieldTypeReferenceId\n sourceFieldTypeUniqueKey\n targetFieldKey\n }\n orderedMandatoryFields{\n sourceFieldTypeReferenceId\n sourceFieldTypeUniqueKey\n targetFieldKey\n }\n }\n }\n }\n ... on PrimitiveInputFieldConfig {\n primitiveType\n }\n }\n }\n }\n}\n```\n\n## Step 2: Choose Blocks\n\nChoose the trigger block and action blocks that you want to use based on the user\'s automation requirements.\n\n## Step 3: Build Workflow Schema\n\nGet the input schema of the \'create_live_workflow\' mutation.\nPay attention that sometimes you need to run queries to fetch some schemas. Read the description of each field in the schema and follow the instructions if there are any.\n\n## Step 4: Build Workflow Block Schemas\n\nFor each block you choose to use, build the workflow block schema (start from the trigger block):\n- **4.a.** For each input field, build the workflow variable schema and use it in the workflow block.\n- **4.b.** For each output field, build the workflow variable schema and use it in the workflow block.\n\n## Step 5: Retrieve allowed constant values for input fields (remote_options)\n\nSometimes you need to configure an input field with a fixed (constant) value.\n\n1. Examine the block\'s inputFieldsConfig.\n • If the field type is PrimitiveInputFieldConfig – you can pass any literal that matches its primitiveType.\n • If the field type is CustomInputFieldConfig – its allowed values are dynamic. You **MUST** fetch them using the remote_options query.\n\n2. Build the remote_options query for every CustomInputFieldConfig you want to set as a constant:\n • Provide the field_type_unique_key of the field.\n • Fill the dependencies_values object with **all mandatory dependencies** listed in fieldTypeData.dependencyConfig.orderedMandatoryFields. You can supply each dependency as a literal value (value) or as a reference to an existing workflow variable (workflowVariableKey).\n\n3. Select the desired option from the query response (options.value / options.title) and store it in a USER_CONFIG workflow variable that will be referenced by the input field.\n\n**Example:**\n```graphql\nquery remote_options {\n remote_options(\n input: {\n field_type_unique_key: \'monday:status_column\'\n dependencies_values: {\n boardId: { value: 118607562 }\n }\n }\n ) {\n options {\n value\n title\n }\n }\n}\n```\n\n## ⚠️ Common Pitfalls\n\n### Pitfall #1: Skipping remote_options for Custom Fields\n- **Problem:** Using hardcoded values for groups, status columns, people columns\n- **Impact:** Workflow fails silently or uses wrong entities\n- **Solution:** Always call `remote_options` for CustomInputField types\n\n### Pitfall #2: Missing Dependency Values \n- **Problem:** Not providing all required `dependencyConfigValues`\n- **Impact:** API returns empty options or errors\n- **Solution:** Check `dependencyConfig.orderedMandatoryFields` and supply all\n\n### Pitfall #3: Wrong Host Type\n- **Problem:** Using BOARD host for "monday workflows" or APP_FEATURE_OBJECT for "automations"\n- **Impact:** Workflow created in wrong context\n- **Solution:** Follow Step 0.1 decision tree strictly\n\n### Pitfall #4: Hardcoded Field Type IDs\n**Common field types that REQUIRE remote_options:**\n- `10380085` → Groups (depends on boardId)\n- `10380084` → Status columns (depends on boardId) \n- `10380073` → People columns (depends on boardId)\n- `10380094` → Status values (depends on boardId + statusColumnId)\n\n**Never hardcode values for these field types!**\n\n### Pitfall #5: Missing appFeatureReferenceId in Workflow Variables\n- **Problem:** When a workflow variable references an app feature (e.g. a custom inbound field), forgetting to include `appFeatureReferenceId`\n- **Impact:** Can cause issues serializing the workflow variable\n- **Solution:** Always populate `appFeatureReferenceId` when the variable references an app feature, even if it has a primitiveType\n\n## Step 6: Fetch Complete Workflow Variable Schemas\n\nFetch the complete workflow variables schemas with the query \'get_workflow_variable_schemas\'. In general, there are 4 types of workflow variables:\nEach workflow variable has a workflowVariableKey (unique) that is used to identify the variable in the workflow block and a sourceKind (NODE_RESULT, USER_CONFIG, REFERENCE, HOST_METADATA).\n\n**Critical:** When the variable is of **USER_CONFIG** kind and its value was selected via the **remote_options** query (see Step 5), the **exact same dependency key-value pairs** you passed to remote_options **must be placed in** `sourceMetadata.configurationMetadata.dependencyConfigValues`. This guarantees the workflow engine can resolve the value at runtime.\n\n- **6.a. Node result:** A variable that has a value fetched from output fields of the previous block.\n **Example:**\n```\n{\n workflowVariableKey: 2,\n sourceKind: "node_results",\n appFeatureReferenceId: <item_field_type_appFeatureReferenceId>,\n sourceMetadata: {\n workflowNodeId: 1,\n outboundFieldKey: "itemId"\n }\n}\n```\n\n- **6.b. User config:** A variable that has a value fetched from the user config (if the user config is a remote option, you need to use the remote options query).\n **Very important:** You need to make sure that all the dependencies of the field type (dependencyConfigValues) are filled in the sourceMetadata (see the schema).\n **Example:**\n```\n{\n workflowVariableKey: 4,\n sourceKind: "user_config",\n appFeatureReferenceId: <appFeatureReferenceId>,\n sourceMetadata: {\n configurationMetadata:{\n dependencyConfigValues:{\n boardId: {workflowVariableKey: 1},\n statusColumnId:{workflowVariableKey: 3},\n itemId:{workflowVariableKey: 2}\n }\n }\n },\n primitiveType: "number",\n config: {\n value: 1,\n title: "Done"\n }\n }\n```\n\n- **6.c. Reference:** A variable that has a value fetched from a reference (if the reference is a remote option, you need to use the remote options query).\n\n- **6.d. Host metadata:** A variable that has a value fetched from the host metadata. For example: board ID when the host is a board.\n **Example:**\n```\n{\n workflowVariableKey: 1,\n sourceKind: "host_metadata",\n sourceMetadata: {\n hostMetadataKey: "hostInstanceId"\n }\n}\n```\n\n### 6.5: Validation Checklist for Workflow Variables\n\n**MANDATORY: Before proceeding to Step 7, validate each workflow variable:**\n\nFor every **user_config** workflow variable:\n- [ ] Does `fieldTypeReferenceId` exist?\n- [ ] If yes → Is this a CustomInputField with `dependencyConfig`?\n- [ ] If yes → Did you call `remote_options` query with ALL required dependencies?\n- [ ] Did you use an actual `value` from the `remote_options` response (not a hardcoded string)?\n- [ ] Are all `dependencyConfigValues` properly referenced by `workflowVariableKey`?\n\n## Step 7: Create the Live Workflow\n\nCreate the live workflow with the query \'create_live_workflow\', using the workflow variables and workflow blocks in the input.\n\n**Example for board automation:**\n```\nmutation {\n create_live_workflow(\n \n workflow: {\n title: "Auto set Status to Done on item creation",\n description: "When an item is created, automatically set its Status to Done.",\n\n workflowBlocks: [\n {\n workflowNodeId: 1,\n blockReferenceId: 10380130,\n title: "When item created",\n inputFields: [\n {\n fieldKey: "boardId",\n workflowVariableKey: 1\n }\n ],\n nextWorkflowBlocksConfig: {\n type: "directMapping",\n mapping: {\n nextWorkflowNode: {\n workflowNodeId: 2\n }\n }\n }\n },\n {\n workflowNodeId: 2,\n blockReferenceId: 10380126,\n title: "Change status",\n inputFields: [\n {\n fieldKey: "boardId",\n workflowVariableKey: 1\n },\n {\n fieldKey: "itemId",\n workflowVariableKey: 2\n },\n {\n fieldKey: "statusColumnId",\n workflowVariableKey: 3\n },\n {\n fieldKey: "statusColumnValue",\n workflowVariableKey: 4\n }\n ]\n }\n ],\n\n workflowVariables: [\n {\n workflowVariableKey: 1,\n sourceKind: "host_metadata",\n sourceMetadata: {\n hostMetadataKey: "hostInstanceId"\n }\n },\n {\n workflowVariableKey: 2,\n sourceKind: "node_results",\n appFeatureReferenceId: <item_field_type_appFeatureReferenceId>,\n sourceMetadata: {\n workflowNodeId: 1,\n outboundFieldKey: "itemId"\n }\n },\n {\n workflowVariableKey: 3,\n sourceKind: "user_config",\n appFeatureReferenceId: <appFeatureReferenceId>,\n sourceMetadata: {\n configurationMetadata:{\n dependencyConfigValues:{\n boardId: {workflowVariableKey: 1},\n itemId: {workflowVariableKey: 2}\n }\n }\n },\n primitiveType: "string",\n config: {\n value: "status",\n title: "Status"\n }\n },\n {\n workflowVariableKey: 4,\n sourceKind: "user_config",\n appFeatureReferenceId: <appFeatureReferenceId>,\n sourceMetadata: {\n configurationMetadata:{\n dependencyConfigValues:{\n boardId: {workflowVariableKey: 1},\n statusColumnId:{workflowVariableKey: 3},\n itemId:{workflowVariableKey: 2}\n }\n }\n },\n primitiveType: "number",\n config: {\n value: 1,\n title: "Done"\n }\n }\n ],\n\n workflowHostData: {\n id: "118607562",\n type: BOARD\n }\n }\n\n ) {\n id\n }\n}\n```\n\n## Summary Checklist:\n1. ✅ Determine if user wants automation (BOARD host) or monday workflows (APP_FEATURE_OBJECT host)\n2. ✅ Check if the appropriate host exists \n3. ✅ Create host if missing\n4. ✅ Prepare workflowHostData with correct host type and ID\n5. ✅ Fetch available blocks\n6. ✅ Choose appropriate blocks\n7. ✅ Build workflow schema\n8. ✅ Configure workflow variables\n9. ✅ Create the live workflow\n\n## Quick Reference:\n- **"Automate X"** → BOARD host\n- **"Create monday workflow"** → APP_FEATURE_OBJECT host\n'.trim()}}},class extends Zm{constructor(){super(...arguments),this.name="read_docs",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Read Documents",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"Get a collection of monday.com documents with their content as markdown. \n\nPAGINATION: \n- Default limit is 25 documents per page\n- Use 'page' parameter to get additional pages (starts at 1)\n- Check response for 'has_more_pages' to know if you should continue paginating\n- If user asks for \"all documents\" and you get exactly 25 results, continue with page 2, 3, etc.\n\nFILTERING: Provide an ID filter object with:\n- type: 'ids' for specific document IDs\n- type: 'object_ids' for specific document object IDs \n- type: 'workspace_ids' for all docs in specific workspaces\n- values: array of ID strings (at least 1 required)\n\nExamples:\n- { type: 'ids', values: ['123', '456'] }\n- { type: 'object_ids', values: ['123'] }\n- { type: 'workspace_ids', values: ['ws_101'] }\n\nUSAGE PATTERNS:\n- For specific documents: use type 'ids' or 'object_ids' (A monday doc has two unique identifiers)\n- For workspace exploration: use type 'workspace_ids' with pagination\n- For large searches: start with page 1, then paginate if has_more_pages=true"}getInputSchema(){return Bx}async executeInternal(e){try{const a=e.ids;let t,i,n;switch(a.type){case"ids":t=a.values;break;case"object_ids":i=a.values;break;case"workspace_ids":n=a.values}const o={ids:t,object_ids:i,limit:e.limit||25,order_by:e.order_by,page:e.page,workspace_ids:n};let p=await this.mondayApi.request(rx,o);if((!p.docs||0===p.docs.length)&&t){const a={ids:void 0,object_ids:t,limit:e.limit||25,order_by:e.order_by,page:e.page,workspace_ids:n};p=await this.mondayApi.request(rx,a)}if(!p.docs||0===p.docs.length){return{content:`No documents found matching the specified criteria${e.page?` (page ${e.page})`:""}.`}}const s=await this.enrichDocsWithMarkdown(p.docs,o),r=this.shouldSuggestPagination(p.docs.length,o.limit||25,o.page||1);return{content:s.content+r}}catch(e){return{content:`Error reading documents: ${e instanceof Error?e.message:"Unknown error occurred"}`}}}shouldSuggestPagination(e,a,t){return e===a?`\n\n🔄 PAGINATION SUGGESTION: You received exactly ${a} documents, which suggests there may be more. Consider calling this tool again with page: ${t+1} to get additional documents.`:""}async enrichDocsWithMarkdown(e,a){const t=await Promise.all(e.filter((e=>null!==e)).map((async e=>{let a="";try{const t={docId:e.id},i=await this.mondayApi.request(dx,t);a=i.export_markdown_from_doc.success&&i.export_markdown_from_doc.markdown?i.export_markdown_from_doc.markdown:`Error getting markdown: ${i.export_markdown_from_doc.error||"Unknown error"}`}catch(e){a=`Error getting markdown: ${e instanceof Error?e.message:"Unknown error"}`}return{id:e.id,object_id:e.object_id,name:e.name,doc_kind:e.doc_kind,created_at:e.created_at,created_by:e.created_by?.name||"Unknown",url:e.url,relative_url:e.relative_url,workspace:e.workspace?.name||"Unknown",workspace_id:e.workspace_id,doc_folder_id:e.doc_folder_id,settings:e.settings,blocks_as_markdown:a}}))),i=a.page||1,n=a.limit||25,o=t.length,p=o===n;return{content:`Successfully retrieved ${t.length} document${1===t.length?"":"s"}.\n\nPAGINATION INFO:\n- Current page: ${i}\n- Documents per page: ${n}\n- Documents in this response: ${o}\n- Has more pages: ${p?"YES - call again with page: "+(i+1):"NO"}\n\nDOCUMENTS:\n${JSON.stringify(t,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="workspace_info",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Get Workspace Information",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"This tool returns the boards, docs and folders in a workspace and which folder they are in. It returns up to 100 of each object type, if you receive 100 assume there are additional objects of that type in the workspace."}getInputSchema(){return Mx}async executeInternal(e){const a={workspace_id:e.workspace_id},t=await this.mondayApi.request(lx,a);if(!t.workspaces||0===t.workspaces.length)return{content:`No workspace found with ID ${e.workspace_id}`};const i=function(e){const{workspaces:a,boards:t,docs:i,folders:n}=e,o=a?.[0];if(!o)throw new Error("No workspace found");const p=new Map((n||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name)).map((e=>[e.id,{id:e.id,name:e.name,boards:[],docs:[]}]))),s=[];(t||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name)).forEach((e=>{const a={id:e.id,name:e.name};e.board_folder_id&&p.has(e.board_folder_id)?p.get(e.board_folder_id).boards.push(a):s.push(a)}));const r=[];return(i||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name)).forEach((e=>{const a={id:e.id,name:e.name};e.doc_folder_id&&p.has(e.doc_folder_id)?p.get(e.doc_folder_id).docs.push(a):r.push(a)})),{workspace:{id:o.id,name:o.name,description:o.description||"",kind:o.kind||"",created_at:o.created_at||"",state:o.state||"",is_default_workspace:o.is_default_workspace||!1,owners_subscribers:(o.owners_subscribers||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name&&null!=e.email)).map((e=>({id:e.id,name:e.name,email:e.email})))},folders:Array.from(p.values()),root_items:{boards:s,docs:r}}}(t);return{content:`Workspace Information:\n\n**Workspace:** ${i.workspace.name} (ID: ${i.workspace.id})\n- Description: ${i.workspace.description||"No description"}\n- Kind: ${i.workspace.kind}\n- State: ${i.workspace.state}\n- Default Workspace: ${i.workspace.is_default_workspace?"Yes":"No"}\n- Created: ${i.workspace.created_at}\n- Owners/Subscribers: ${i.workspace.owners_subscribers.length} users\n\n**Folders (${i.folders.length}):**\n${i.folders.map((e=>`\n📁 ${e.name} (ID: ${e.id})\n - Boards (${e.boards.length}): ${e.boards.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}\n - Docs (${e.docs.length}): ${e.docs.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}`)).join("\n")}\n\n**Root Level Items:**\n- Boards (${i.root_items.boards.length}): ${i.root_items.boards.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}\n- Docs (${i.root_items.docs.length}): ${i.root_items.docs.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}\n\n**Summary:**\n- Total Folders: ${i.folders.length}\n- Total Boards: ${i.folders.reduce(((e,a)=>e+a.boards.length),0)+i.root_items.boards.length}\n- Total Docs: ${i.folders.reduce(((e,a)=>e+a.docs.length),0)+i.root_items.docs.length}\n\n${JSON.stringify(i,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="list_workspace",this.type=exports.ToolType.READ,this.annotations=Qm({title:"List Workspaces",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"List all workspaces available to the user. Returns up to 500 workspaces with their ID, name, and description."}getInputSchema(){return zx}async executeInternal(e){const a={limit:500},t=await this.mondayApi.request(qx,a);if(!t.workspaces||0===t.workspaces.length)return{content:"No workspaces found."};const i=t.workspaces.filter((e=>null!==e)).map((e=>{const a=e.description?` - ${e.description}`:"";return`• **${e.name}** (ID: ${e.id})${a}`})).join("\n");return{content:`**Available Workspaces (${t.workspaces.length}):**\n\n${i}\n\n**Summary:**\nTotal workspaces found: ${t.workspaces.length}\n\n${JSON.stringify(t.workspaces,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="create_doc",this.type=exports.ToolType.WRITE,this.annotations=Qm({title:"Create Document",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1})}getDescription(){return'Create a new monday.com doc either inside a workspace or attached to an item (via a doc column). After creation, the provided markdown will be appended to the document.\n\nLOCATION TYPES:\n- workspace: Creates a document in a workspace (requires workspace_id, optional doc_kind, optional folder_id)\n- item: Creates a document attached to an item (requires item_id, optional column_id)\n\nUSAGE EXAMPLES:\n- Workspace doc: { location: { type: "workspace", workspace_id: 123, doc_kind: "private" }, markdown: "..." }\n- Workspace doc in folder: { location: { type: "workspace", workspace_id: 123, folder_id: 17264196 }, markdown: "..." }\n- Item doc: { location: { type: "item", item_id: 456, column_id: "doc_col_1" }, markdown: "..." }'}getInputSchema(){return Hx}async executeInternal(e){try{let a,t;if(e.location.type===Gx.enum.workspace){const i={location:{workspace:{workspace_id:e.location.workspace_id.toString(),name:e.doc_name,kind:e.location.doc_kind||hy.Public,folder_id:e.location.folder_id?.toString()}}},n=await this.mondayApi.request(ox,i);a=n?.create_doc?.id??void 0,t=n?.create_doc?.url??void 0}else if(e.location.type===Gx.enum.item){const i={itemId:e.location.item_id.toString()},n=await this.mondayApi.request(nx,i),o=n.items?.[0];if(!o)return{content:`Error: Item with id ${e.location.item_id} not found.`};const p=o.board?.id,s=o.board?.columns?.find((e=>e&&e.type===wy.Doc));let r=e.location.column_id;if(!r)if(s)r=s.id;else{const e={boardId:p.toString(),columnType:wy.Doc,columnTitle:"Doc"},a=await this.mondayApi.request(Xg,e);if(r=a?.create_column?.id,!r)return{content:"Error: Failed to create doc column."}}const d={location:{board:{item_id:e.location.item_id.toString(),column_id:r}}},l=await this.mondayApi.request(ox,d);if(a=l.create_doc?.id??void 0,t=l.create_doc?.url??void 0,e.doc_name&&a)try{const t={docId:a,name:e.doc_name};await this.mondayApi.request(sx,t)}catch(e){console.warn("Failed to update doc name:",e)}}if(!a)return{content:"Error: Failed to create document."};const i={docId:a,markdown:e.markdown},n=await this.mondayApi.request(px,i),o=n?.add_content_to_doc_from_markdown?.success,p=n?.add_content_to_doc_from_markdown?.error;return o?{content:`✅ Document successfully created (id: ${a}). ${t?`\n\nURL: ${t}`:""}`}:{content:`Document ${a} created, but failed to add markdown content: ${p||"Unknown error"}`}}catch(e){return{content:`Error creating document: ${e instanceof Error?e.message:"Unknown error"}`}}}}],Wx=[...Kx,...R];exports.allGraphqlApiTools=Kx,exports.allMondayAppsTools=R,exports.allTools=Wx;
|
|
614
|
+
`),i=await this.mondayApi.request(t);if(!i.__type)return{content:`Type '${e.typeName}' not found in the GraphQL schema. Please check the type name and try again.`};let n=`## Type: ${i.__type.name||"Unnamed"} ${e.typeName===i.__type.name?"":`(queried: ${e.typeName})`}\nKind: ${i.__type.kind}\n${i.__type.description?`Description: ${i.__type.description}`:""}\n\n`;return i.__type.fields&&i.__type.fields.length>0&&(n+="## Fields\n",i.__type.fields.forEach((e=>{const a=$x(e.type);n+=`- ${e.name}: ${a}${e.description?` - ${e.description}`:""}\n`,e.args&&e.args.length>0&&(n+=" Arguments:\n",e.args.forEach((e=>{const a=$x(e.type);n+=` - ${e.name}: ${a}${e.description?` - ${e.description}`:""}${e.defaultValue?` (default: ${e.defaultValue})`:""}\n`})))})),n+="\n"),i.__type.inputFields&&i.__type.inputFields.length>0&&(n+="## Input Fields\n",i.__type.inputFields.forEach((e=>{const a=$x(e.type);n+=`- ${e.name}: ${a}${e.description?` - ${e.description}`:""}${e.defaultValue?` (default: ${e.defaultValue})`:""}\n`})),n+="\n"),i.__type.interfaces&&i.__type.interfaces.length>0&&(n+="## Implements\n",i.__type.interfaces.forEach((e=>{n+=`- ${e.name}\n`})),n+="\n"),i.__type.enumValues&&i.__type.enumValues.length>0&&(n+="## Enum Values\n",i.__type.enumValues.forEach((e=>{n+=`- ${e.name}${e.description?` - ${e.description}`:""}\n`})),n+="\n"),i.__type.possibleTypes&&i.__type.possibleTypes.length>0&&(n+="## Possible Types\n",i.__type.possibleTypes.forEach((e=>{n+=`- ${e.name}\n`}))),n+=`\n## Usage Examples\nIf this is a Query or Mutation field, you can use it in the all_monday_api tool.\n\nExample for query:\nall_monday_api(operation: "query", name: "getTypeData", variables: "{\\"typeName\\": \\"${i.__type.name}\\"}")\n\nExample for object field access:\nWhen querying objects that have this type, include these fields in your query.\n`,{content:n}}catch(e){const a=e instanceof Error?e.message:"Unknown error",t=a.includes("JSON");return{content:`Error fetching type details: ${a}${t?"\n\nThis could be because the type name is incorrect or the GraphQL query format is invalid. Please check the type name and try again.":""}`}}var a}},class extends Zm{constructor(){super(...arguments),this.name="create_custom_activity",this.type=exports.ToolType.WRITE,this.annotations=Qm({title:"Create Custom Activity",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1})}getDescription(){return"Create a new custom activity in the E&A app"}getInputSchema(){return bx}async executeInternal(e){const a={color:e.color,icon_id:e.icon_id,name:e.name};return await this.mondayApi.request(ax,a),{content:`Custom activity '${e.name}' with color ${e.color} and icon ${e.icon_id} successfully created`}}},class extends Zm{constructor(){super(...arguments),this.name="create_timeline_item",this.type=exports.ToolType.WRITE,this.annotations=Qm({title:"Create Timeline Item",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1})}getDescription(){return"Create a new timeline item in the E&A app"}getInputSchema(){return wx}async executeInternal(e){const a={item_id:e.item_id.toString(),custom_activity_id:e.custom_activity_id,title:e.title,timestamp:e.timestamp,summary:e.summary,content:e.content,location:e.location,phone:e.phone,url:e.url};e.start_timestamp&&e.end_timestamp&&(a.time_range={start_timestamp:e.start_timestamp,end_timestamp:e.end_timestamp});const t=await this.mondayApi.request(tx,a);return{content:`Timeline item '${e.title}' with ID ${t.create_timeline_item?.id} successfully created on item ${e.item_id}`}}},class extends Zm{constructor(){super(...arguments),this.name="fetch_custom_activity",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Fetch Custom Activities",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"Get custom activities from the E&A app"}getInputSchema(){return Sx}async executeInternal(e){const a=await this.mondayApi.request(ix);if(!a.custom_activity||0===a.custom_activity.length)return{content:"No custom activities found"};const t=a.custom_activity.map((e=>({id:e.id,name:e.name,color:e.color,icon_id:e.icon_id,type:e.type})));return{content:`Found ${t.length} custom activities: ${JSON.stringify(t,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="create_workflow_instructions",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Create Workflow Instructions"})}getDescription(){return'When the user asks to create a workflow or automation, you must use this tool, which provides instructions on how to create a workflow.\n This tool is very important and should be used when the user explicitly requests:\n - Workflow creation (e.g., "create a monday workflow", "create a new workflow").\n - Automation (e.g., "automate this process", "when item is created, set status to done")\n '}getInputSchema(){return{}}async executeInternal(){return{content:'\n# Instructions to Create a Live Workflow\n\n## General Explanation:\n- A workflow is a structured sequence of actions and conditions and triggers (blocks) designed to automate processes (for example, trigger -> action -> action -> ...).\n- A block is a reusable logic unit; it can be a trigger, condition or action. It has input fields and output fields.\n- A workflow block wraps a block (the underlying logic unit), providing the configuration for its input fields and defining how it connects to other blocks in the workflow graph.\n- A workflow variable presents a value that is used in the workflow block. It has a unique key, a value, and dependencies.\nIt can be a result of a previous block, a user config, a reference, or a host metadata.\nIf it is a user config, you have to get the possible values for the value from remote options query.\n\nTo create a live workflow in monday.com, follow these steps:\n\n## Step 0: Determine and Ensure Host Exists (CRITICAL FIRST STEP)\n\n**Every workflow MUST be attached to an existing host entity.** Before creating any workflow, you must:\n\n### 0.1 Identify the Host Type Based on User Request\n\n**IMPORTANT: The host type depends on what the user is asking for:**\n\n- **If user wants "monday workflows"** (e.g., "create a monday workflow") ALWAYS USE THIS HOST TYPE:\n - Host type: **APP_FEATURE_OBJECT** \n - This is the standalone Workflows product\n - User explicitly mentions "monday workflow" or "workflow" without board context\n \n- **If user wants "automation"** (e.g., "automate when item is created", "set status automatically"):\n - Host type: **BOARD**\n - The automation will run on a specific board\n - User typically mentions board-related triggers/actions and the workflow is pretty simple\n\n### 0.2 Check if Host Exists\n**Always check first before creating:**\n\n**For BOARD hosts (automations):**\n```\nquery {\n boards(ids: [BOARD_ID]) {\n id\n name\n }\n}\n```\nIf user didn\'t specify a board, you may need to ask which board or list available boards.\n\n**For APP_FEATURE_OBJECT hosts (monday workflows):**\nCheck if a workflows object exists for the user/workspace. The exact query depends on the API structure for workflows objects.\n\n### 0.3 Create Host if Missing\n**Only if the host doesn\'t exist, create it first:**\n\n**For BOARD hosts:**\n```\nmutation {\n create_board(\n board_name: "Board Name",\n board_kind: public\n ) {\n id\n }\n}\n```\n\n**For APP_FEATURE_OBJECT hosts:**\n```\nmutation {\n create_workflows_object(\n name: "Workflow Name"\n ) {\n id\n }\n}\n```\n\n### 0.4 Prepare workflowHostData\nOnce you have confirmed the host exists (or created it), prepare the `workflowHostData` object:\n\n**For automations (board host):**\n```\nworkflowHostData: {\n id: "BOARD_ID_HERE",\n type: BOARD\n}\n```\n\n**For monday workflows (app feature host):**\n```\nworkflowHostData: {\n id: "WORKFLOWS_OBJECT_ID_HERE",\n type: APP_FEATURE_OBJECT\n}\n```\n\n**⚠️ IMPORTANT: Do not proceed to the next steps until the host is confirmed to exist and you have its ID.**\n\n## Step 1: Fetch Available Blocks\n\nFetch the blocks including the input fields config using monday api:\nEach block represents a trigger, condition or action. Blocks can have input fields and output fields.\nIn general, you can understand what a block does by its description or name.\nThe "kind" field in the block represents the type of the block (trigger, condition or action).\nThere are some types of input fields: In the case of CustomInputField, it refers to a field type feature. \nIt has special functionality — for example, remote options. These are all the possible values for this type. \nFor example, if the field type is \'board\', then the options will include a list of all boardIds \nTheir identifier is the \'fieldTypeReferenceId\' (or \'id\' in the fieldTypeData).\nThere are dependencies that tell us what values we need to know to fetch the options for the custom input field\'s value.\nFor example, if the custom input field is a status column, the dependency is the board ID.\n\n**Example query to fetch the blocks:**\n```\nquery {\n blocks {\n blocks {\n id\n description\n name\n kind\n inputFieldsConfig {\n fieldTitle\n fieldKey\n ... on CustomInputFieldConfig {\n fieldTypeReferenceId\n fieldTypeUniqueKey\n fieldTypeData {\n id\n dependencyConfig{\n optionalFields{\n sourceFieldTypeReferenceId\n sourceFieldTypeUniqueKey\n targetFieldKey\n }\n orderedMandatoryFields{\n sourceFieldTypeReferenceId\n sourceFieldTypeUniqueKey\n targetFieldKey\n }\n }\n }\n }\n ... on PrimitiveInputFieldConfig {\n primitiveType\n }\n }\n }\n }\n}\n```\n\n## Step 2: Choose Blocks\n\nChoose the trigger block and action blocks that you want to use based on the user\'s automation requirements.\n\n## Step 3: Build Workflow Schema\n\nGet the input schema of the \'create_live_workflow\' mutation.\nPay attention that sometimes you need to run queries to fetch some schemas. Read the description of each field in the schema and follow the instructions if there are any.\n\n## Step 4: Build Workflow Block Schemas\n\nFor each block you choose to use, build the workflow block schema (start from the trigger block):\n- **4.a.** For each input field, build the workflow variable schema and use it in the workflow block.\n- **4.b.** For each output field, build the workflow variable schema and use it in the workflow block.\n\n## Step 5: Retrieve allowed constant values for input fields (remote_options)\n\nSometimes you need to configure an input field with a fixed (constant) value.\n\n1. Examine the block\'s inputFieldsConfig.\n • If the field type is PrimitiveInputFieldConfig – you can pass any literal that matches its primitiveType.\n • If the field type is CustomInputFieldConfig – its allowed values are dynamic. You **MUST** fetch them using the remote_options query.\n\n2. Build the remote_options query for every CustomInputFieldConfig you want to set as a constant:\n • Provide the field_type_unique_key of the field.\n • Fill the dependencies_values object with **all mandatory dependencies** listed in fieldTypeData.dependencyConfig.orderedMandatoryFields. You can supply each dependency as a literal value (value) or as a reference to an existing workflow variable (workflowVariableKey).\n\n3. Select the desired option from the query response (options.value / options.title) and store it in a USER_CONFIG workflow variable that will be referenced by the input field.\n\n**Example:**\n```graphql\nquery remote_options {\n remote_options(\n input: {\n field_type_unique_key: \'monday:status_column\'\n dependencies_values: {\n boardId: { value: 118607562 }\n }\n }\n ) {\n options {\n value\n title\n }\n }\n}\n```\n\n## ⚠️ Common Pitfalls\n\n### Pitfall #1: Skipping remote_options for Custom Fields\n- **Problem:** Using hardcoded values for groups, status columns, people columns\n- **Impact:** Workflow fails silently or uses wrong entities\n- **Solution:** Always call `remote_options` for CustomInputField types\n\n### Pitfall #2: Missing Dependency Values \n- **Problem:** Not providing all required `dependencyConfigValues`\n- **Impact:** API returns empty options or errors\n- **Solution:** Check `dependencyConfig.orderedMandatoryFields` and supply all\n\n### Pitfall #3: Wrong Host Type\n- **Problem:** Using BOARD host for "monday workflows" or APP_FEATURE_OBJECT for "automations"\n- **Impact:** Workflow created in wrong context\n- **Solution:** Follow Step 0.1 decision tree strictly\n\n### Pitfall #4: Hardcoded Field Type IDs\n**Common field types that REQUIRE remote_options:**\n- `10380085` → Groups (depends on boardId)\n- `10380084` → Status columns (depends on boardId) \n- `10380073` → People columns (depends on boardId)\n- `10380094` → Status values (depends on boardId + statusColumnId)\n\n**Never hardcode values for these field types!**\n\n### Pitfall #5: Missing appFeatureReferenceId in Workflow Variables\n- **Problem:** When a workflow variable references an app feature (e.g. a custom inbound field), forgetting to include `appFeatureReferenceId`\n- **Impact:** Can cause issues serializing the workflow variable\n- **Solution:** Always populate `appFeatureReferenceId` when the variable references an app feature, even if it has a primitiveType\n\n## Step 6: Fetch Complete Workflow Variable Schemas\n\nFetch the complete workflow variables schemas with the query \'get_workflow_variable_schemas\'. In general, there are 4 types of workflow variables:\nEach workflow variable has a workflowVariableKey (unique) that is used to identify the variable in the workflow block and a sourceKind (NODE_RESULT, USER_CONFIG, REFERENCE, HOST_METADATA).\n\n**Critical:** When the variable is of **USER_CONFIG** kind and its value was selected via the **remote_options** query (see Step 5), the **exact same dependency key-value pairs** you passed to remote_options **must be placed in** `sourceMetadata.configurationMetadata.dependencyConfigValues`. This guarantees the workflow engine can resolve the value at runtime.\n\n- **6.a. Node result:** A variable that has a value fetched from output fields of the previous block.\n **Example:**\n```\n{\n workflowVariableKey: 2,\n sourceKind: "node_results",\n appFeatureReferenceId: <item_field_type_appFeatureReferenceId>,\n sourceMetadata: {\n workflowNodeId: 1,\n outboundFieldKey: "itemId"\n }\n}\n```\n\n- **6.b. User config:** A variable that has a value fetched from the user config (if the user config is a remote option, you need to use the remote options query).\n **Very important:** You need to make sure that all the dependencies of the field type (dependencyConfigValues) are filled in the sourceMetadata (see the schema).\n **Example:**\n```\n{\n workflowVariableKey: 4,\n sourceKind: "user_config",\n appFeatureReferenceId: <appFeatureReferenceId>,\n sourceMetadata: {\n configurationMetadata:{\n dependencyConfigValues:{\n boardId: {workflowVariableKey: 1},\n statusColumnId:{workflowVariableKey: 3},\n itemId:{workflowVariableKey: 2}\n }\n }\n },\n primitiveType: "number",\n config: {\n value: 1,\n title: "Done"\n }\n }\n```\n\n- **6.c. Reference:** A variable that has a value fetched from a reference (if the reference is a remote option, you need to use the remote options query).\n\n- **6.d. Host metadata:** A variable that has a value fetched from the host metadata. For example: board ID when the host is a board.\n **Example:**\n```\n{\n workflowVariableKey: 1,\n sourceKind: "host_metadata",\n sourceMetadata: {\n hostMetadataKey: "hostInstanceId"\n }\n}\n```\n\n### 6.5: Validation Checklist for Workflow Variables\n\n**MANDATORY: Before proceeding to Step 7, validate each workflow variable:**\n\nFor every **user_config** workflow variable:\n- [ ] Does `fieldTypeReferenceId` exist?\n- [ ] If yes → Is this a CustomInputField with `dependencyConfig`?\n- [ ] If yes → Did you call `remote_options` query with ALL required dependencies?\n- [ ] Did you use an actual `value` from the `remote_options` response (not a hardcoded string)?\n- [ ] Are all `dependencyConfigValues` properly referenced by `workflowVariableKey`?\n\n## Step 7: Create the Live Workflow\n\nCreate the live workflow with the query \'create_live_workflow\', using the workflow variables and workflow blocks in the input.\n\n**Example for board automation:**\n```\nmutation {\n create_live_workflow(\n \n workflow: {\n title: "Auto set Status to Done on item creation",\n description: "When an item is created, automatically set its Status to Done.",\n\n workflowBlocks: [\n {\n workflowNodeId: 1,\n blockReferenceId: 10380130,\n title: "When item created",\n inputFields: [\n {\n fieldKey: "boardId",\n workflowVariableKey: 1\n }\n ],\n nextWorkflowBlocksConfig: {\n type: "directMapping",\n mapping: {\n nextWorkflowNode: {\n workflowNodeId: 2\n }\n }\n }\n },\n {\n workflowNodeId: 2,\n blockReferenceId: 10380126,\n title: "Change status",\n inputFields: [\n {\n fieldKey: "boardId",\n workflowVariableKey: 1\n },\n {\n fieldKey: "itemId",\n workflowVariableKey: 2\n },\n {\n fieldKey: "statusColumnId",\n workflowVariableKey: 3\n },\n {\n fieldKey: "statusColumnValue",\n workflowVariableKey: 4\n }\n ]\n }\n ],\n\n workflowVariables: [\n {\n workflowVariableKey: 1,\n sourceKind: "host_metadata",\n sourceMetadata: {\n hostMetadataKey: "hostInstanceId"\n }\n },\n {\n workflowVariableKey: 2,\n sourceKind: "node_results",\n appFeatureReferenceId: <item_field_type_appFeatureReferenceId>,\n sourceMetadata: {\n workflowNodeId: 1,\n outboundFieldKey: "itemId"\n }\n },\n {\n workflowVariableKey: 3,\n sourceKind: "user_config",\n appFeatureReferenceId: <appFeatureReferenceId>,\n sourceMetadata: {\n configurationMetadata:{\n dependencyConfigValues:{\n boardId: {workflowVariableKey: 1},\n itemId: {workflowVariableKey: 2}\n }\n }\n },\n primitiveType: "string",\n config: {\n value: "status",\n title: "Status"\n }\n },\n {\n workflowVariableKey: 4,\n sourceKind: "user_config",\n appFeatureReferenceId: <appFeatureReferenceId>,\n sourceMetadata: {\n configurationMetadata:{\n dependencyConfigValues:{\n boardId: {workflowVariableKey: 1},\n statusColumnId:{workflowVariableKey: 3},\n itemId:{workflowVariableKey: 2}\n }\n }\n },\n primitiveType: "number",\n config: {\n value: 1,\n title: "Done"\n }\n }\n ],\n\n workflowHostData: {\n id: "118607562",\n type: BOARD\n }\n }\n\n ) {\n id\n }\n}\n```\n\n## Summary Checklist:\n1. ✅ Determine if user wants automation (BOARD host) or monday workflows (APP_FEATURE_OBJECT host)\n2. ✅ Check if the appropriate host exists \n3. ✅ Create host if missing\n4. ✅ Prepare workflowHostData with correct host type and ID\n5. ✅ Fetch available blocks\n6. ✅ Choose appropriate blocks\n7. ✅ Build workflow schema\n8. ✅ Configure workflow variables\n9. ✅ Create the live workflow\n\n## Quick Reference:\n- **"Automate X"** → BOARD host\n- **"Create monday workflow"** → APP_FEATURE_OBJECT host\n'.trim()}}},class extends Zm{constructor(){super(...arguments),this.name="read_docs",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Read Documents",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"Get a collection of monday.com documents with their content as markdown. \n\nPAGINATION: \n- Default limit is 25 documents per page\n- Use 'page' parameter to get additional pages (starts at 1)\n- Check response for 'has_more_pages' to know if you should continue paginating\n- If user asks for \"all documents\" and you get exactly 25 results, continue with page 2, 3, etc.\n\nFILTERING: Provide an ID filter object with:\n- type: 'ids' for specific document IDs\n- type: 'object_ids' for specific document object IDs \n- type: 'workspace_ids' for all docs in specific workspaces\n- values: array of ID strings (at least 1 required)\n\nExamples:\n- { type: 'ids', values: ['123', '456'] }\n- { type: 'object_ids', values: ['123'] }\n- { type: 'workspace_ids', values: ['ws_101'] }\n\nUSAGE PATTERNS:\n- For specific documents: use type 'ids' or 'object_ids' (A monday doc has two unique identifiers)\n- For workspace exploration: use type 'workspace_ids' with pagination\n- For large searches: start with page 1, then paginate if has_more_pages=true"}getInputSchema(){return Bx}async executeInternal(e){try{const a=e.ids;let t,i,n;switch(a.type){case"ids":t=a.values;break;case"object_ids":i=a.values;break;case"workspace_ids":n=a.values}const o={ids:t,object_ids:i,limit:e.limit||25,order_by:e.order_by,page:e.page,workspace_ids:n};let p=await this.mondayApi.request(rx,o);if((!p.docs||0===p.docs.length)&&t){const a={ids:void 0,object_ids:t,limit:e.limit||25,order_by:e.order_by,page:e.page,workspace_ids:n};p=await this.mondayApi.request(rx,a)}if(!p.docs||0===p.docs.length){return{content:`No documents found matching the specified criteria${e.page?` (page ${e.page})`:""}.`}}const s=await this.enrichDocsWithMarkdown(p.docs,o),r=this.shouldSuggestPagination(p.docs.length,o.limit||25,o.page||1);return{content:s.content+r}}catch(e){return{content:`Error reading documents: ${e instanceof Error?e.message:"Unknown error occurred"}`}}}shouldSuggestPagination(e,a,t){return e===a?`\n\n🔄 PAGINATION SUGGESTION: You received exactly ${a} documents, which suggests there may be more. Consider calling this tool again with page: ${t+1} to get additional documents.`:""}async enrichDocsWithMarkdown(e,a){const t=await Promise.all(e.filter((e=>null!==e)).map((async e=>{let a="";try{const t={docId:e.id},i=await this.mondayApi.request(dx,t);a=i.export_markdown_from_doc.success&&i.export_markdown_from_doc.markdown?i.export_markdown_from_doc.markdown:`Error getting markdown: ${i.export_markdown_from_doc.error||"Unknown error"}`}catch(e){a=`Error getting markdown: ${e instanceof Error?e.message:"Unknown error"}`}return{id:e.id,object_id:e.object_id,name:e.name,doc_kind:e.doc_kind,created_at:e.created_at,created_by:e.created_by?.name||"Unknown",url:e.url,relative_url:e.relative_url,workspace:e.workspace?.name||"Unknown",workspace_id:e.workspace_id,doc_folder_id:e.doc_folder_id,settings:e.settings,blocks_as_markdown:a}}))),i=a.page||1,n=a.limit||25,o=t.length,p=o===n;return{content:`Successfully retrieved ${t.length} document${1===t.length?"":"s"}.\n\nPAGINATION INFO:\n- Current page: ${i}\n- Documents per page: ${n}\n- Documents in this response: ${o}\n- Has more pages: ${p?"YES - call again with page: "+(i+1):"NO"}\n\nDOCUMENTS:\n${JSON.stringify(t,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="workspace_info",this.type=exports.ToolType.READ,this.annotations=Qm({title:"Get Workspace Information",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"This tool returns the boards, docs and folders in a workspace and which folder they are in. It returns up to 100 of each object type, if you receive 100 assume there are additional objects of that type in the workspace."}getInputSchema(){return Mx}async executeInternal(e){const a={workspace_id:e.workspace_id},t=await this.mondayApi.request(lx,a);if(!t.workspaces||0===t.workspaces.length)return{content:`No workspace found with ID ${e.workspace_id}`};const i=function(e){const{workspaces:a,boards:t,docs:i,folders:n}=e,o=a?.[0];if(!o)throw new Error("No workspace found");const p=new Map((n||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name)).map((e=>[e.id,{id:e.id,name:e.name,boards:[],docs:[]}]))),s=[];(t||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name)).forEach((e=>{const a={id:e.id,name:e.name};e.board_folder_id&&p.has(e.board_folder_id)?p.get(e.board_folder_id).boards.push(a):s.push(a)}));const r=[];return(i||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name)).forEach((e=>{const a={id:e.id,name:e.name};e.doc_folder_id&&p.has(e.doc_folder_id)?p.get(e.doc_folder_id).docs.push(a):r.push(a)})),{workspace:{id:o.id,name:o.name,description:o.description||"",kind:o.kind||"",created_at:o.created_at||"",state:o.state||"",is_default_workspace:o.is_default_workspace||!1,owners_subscribers:(o.owners_subscribers||[]).filter((e=>null!=e&&null!=e.id&&null!=e.name&&null!=e.email)).map((e=>({id:e.id,name:e.name,email:e.email})))},folders:Array.from(p.values()),root_items:{boards:s,docs:r}}}(t);return{content:`Workspace Information:\n\n**Workspace:** ${i.workspace.name} (ID: ${i.workspace.id})\n- Description: ${i.workspace.description||"No description"}\n- Kind: ${i.workspace.kind}\n- State: ${i.workspace.state}\n- Default Workspace: ${i.workspace.is_default_workspace?"Yes":"No"}\n- Created: ${i.workspace.created_at}\n- Owners/Subscribers: ${i.workspace.owners_subscribers.length} users\n\n**Folders (${i.folders.length}):**\n${i.folders.map((e=>`\n📁 ${e.name} (ID: ${e.id})\n - Boards (${e.boards.length}): ${e.boards.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}\n - Docs (${e.docs.length}): ${e.docs.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}`)).join("\n")}\n\n**Root Level Items:**\n- Boards (${i.root_items.boards.length}): ${i.root_items.boards.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}\n- Docs (${i.root_items.docs.length}): ${i.root_items.docs.map((e=>`${e.name} (${e.id})`)).join(", ")||"None"}\n\n**Summary:**\n- Total Folders: ${i.folders.length}\n- Total Boards: ${i.folders.reduce(((e,a)=>e+a.boards.length),0)+i.root_items.boards.length}\n- Total Docs: ${i.folders.reduce(((e,a)=>e+a.docs.length),0)+i.root_items.docs.length}\n\n${JSON.stringify(i,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="list_workspaces",this.type=exports.ToolType.READ,this.annotations=Qm({title:"List Workspaces",readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0})}getDescription(){return"List all workspaces available to the user. Returns up to 500 workspaces with their ID, name, and description."}getInputSchema(){return zx}async executeInternal(e){const a={limit:5e3},t=await this.mondayApi.request(qx,a);if(!t.workspaces||0===t.workspaces.length)return{content:"No workspaces found."};const i=t.workspaces.filter((e=>null!==e)).map((e=>{const a=e.description?` - ${e.description}`:"";return`• **${e.name}** (ID: ${e.id})${a}`})).join("\n");return{content:`**Available Workspaces (${t.workspaces.length}):**\n\n${i}\n\n**Summary:**\nTotal workspaces found: ${t.workspaces.length}\n\n${JSON.stringify(t.workspaces,null,2)}`}}},class extends Zm{constructor(){super(...arguments),this.name="create_doc",this.type=exports.ToolType.WRITE,this.annotations=Qm({title:"Create Document",readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1})}getDescription(){return'Create a new monday.com doc either inside a workspace or attached to an item (via a doc column). After creation, the provided markdown will be appended to the document.\n\nLOCATION TYPES:\n- workspace: Creates a document in a workspace (requires workspace_id, optional doc_kind, optional folder_id)\n- item: Creates a document attached to an item (requires item_id, optional column_id)\n\nUSAGE EXAMPLES:\n- Workspace doc: { location: { type: "workspace", workspace_id: 123, doc_kind: "private" }, markdown: "..." }\n- Workspace doc in folder: { location: { type: "workspace", workspace_id: 123, folder_id: 17264196 }, markdown: "..." }\n- Item doc: { location: { type: "item", item_id: 456, column_id: "doc_col_1" }, markdown: "..." }'}getInputSchema(){return Hx}async executeInternal(e){try{let a,t;if(e.location.type===Gx.enum.workspace){const i={location:{workspace:{workspace_id:e.location.workspace_id.toString(),name:e.doc_name,kind:e.location.doc_kind||hy.Public,folder_id:e.location.folder_id?.toString()}}},n=await this.mondayApi.request(ox,i);a=n?.create_doc?.id??void 0,t=n?.create_doc?.url??void 0}else if(e.location.type===Gx.enum.item){const i={itemId:e.location.item_id.toString()},n=await this.mondayApi.request(nx,i),o=n.items?.[0];if(!o)return{content:`Error: Item with id ${e.location.item_id} not found.`};const p=o.board?.id,s=o.board?.columns?.find((e=>e&&e.type===wy.Doc));let r=e.location.column_id;if(!r)if(s)r=s.id;else{const e={boardId:p.toString(),columnType:wy.Doc,columnTitle:"Doc"},a=await this.mondayApi.request(Xg,e);if(r=a?.create_column?.id,!r)return{content:"Error: Failed to create doc column."}}const d={location:{board:{item_id:e.location.item_id.toString(),column_id:r}}},l=await this.mondayApi.request(ox,d);if(a=l.create_doc?.id??void 0,t=l.create_doc?.url??void 0,e.doc_name&&a)try{const t={docId:a,name:e.doc_name};await this.mondayApi.request(sx,t)}catch(e){console.warn("Failed to update doc name:",e)}}if(!a)return{content:"Error: Failed to create document."};const i={docId:a,markdown:e.markdown},n=await this.mondayApi.request(px,i),o=n?.add_content_to_doc_from_markdown?.success,p=n?.add_content_to_doc_from_markdown?.error;return o?{content:`✅ Document successfully created (id: ${a}). ${t?`\n\nURL: ${t}`:""}`}:{content:`Document ${a} created, but failed to add markdown content: ${p||"Unknown error"}`}}catch(e){return{content:`Error creating document: ${e instanceof Error?e.message:"Unknown error"}`}}}}],Wx=[...Kx,...R];exports.allGraphqlApiTools=Kx,exports.allMondayAppsTools=R,exports.allTools=Wx;
|
|
615
615
|
//# sourceMappingURL=index.js.map
|