quip_replace_content
Replace existing content in Quip documents with new markdown content using the document's thread ID.
Instructions
Replace content in an existing Quip document
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | The Quip document thread ID | |
| content | Yes | New markdown content to replace the document content |
Implementation Reference
- src/index.ts:101-118 (registration)Registration of the 'quip_replace_content' tool in the ListToolsRequestSchema handler, including name, description, and input schema.{ name: 'quip_replace_content', description: 'Replace content in an existing Quip document', inputSchema: { type: 'object', properties: { threadId: { type: 'string', description: 'The Quip document thread ID' }, content: { type: 'string', description: 'New markdown content to replace the document content' } }, required: ['threadId', 'content'], }, },
- src/index.ts:104-117 (schema)Input schema for the quip_replace_content tool, defining required threadId and content parameters.inputSchema: { type: 'object', properties: { threadId: { type: 'string', description: 'The Quip document thread ID' }, content: { type: 'string', description: 'New markdown content to replace the document content' } }, required: ['threadId', 'content'], },
- src/index.ts:173-179 (handler)Specific handler case in the CallToolRequestSchema switch for 'quip_replace_content', validating inputs and delegating to editDocument helper with 'REPLACE' operation.case 'quip_replace_content': { const typedArgs = args as any; if (!typedArgs.threadId || !typedArgs.content) { throw new McpError(ErrorCode.InvalidParams, 'threadId and content are required'); } return await this.editDocument(String(typedArgs.threadId), String(typedArgs.content), 'REPLACE'); }
- src/index.ts:235-268 (helper)editDocument helper method implementing the core logic for replacing document content by invoking the quip_edit.py script with REPLACE operation.private async editDocument(threadId: string, content: string, operation: string) { try { console.log(`Editing document ${threadId} with operation ${operation}...`); // Create a temporary file to store the content const tempFilePath = `/tmp/quip_content_${Date.now()}.md`; const writeCommand = `echo "${content.replace(/"/g, '\\"')}" > ${tempFilePath}`; await execAsync(writeCommand); // Execute the Python script to edit the document const command = `python -u ${path.join(SCRIPTS_DIR, 'quip_edit.py')} ${threadId} ${operation.toLowerCase()} ${tempFilePath}`; const { stdout, stderr } = await execAsync(command); // Clean up the temporary file await execAsync(`rm ${tempFilePath}`); if (stderr) { console.error(`Error editing document: ${stderr}`); throw new Error(stderr); } return { content: [ { type: 'text', text: stdout || `Successfully ${operation.toLowerCase()}ed content to document ${threadId}`, }, ], }; } catch (error) { console.error(`Error ${operation.toLowerCase()}ing document:`, error); throw error; } }