think
Record and store thoughts for later reference using the Local Utilities MCP Server. This tool helps users capture ideas and maintain a thought log through a simple interface.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| thought | Yes | The thought content to record |
Implementation Reference
- src/mcp/think.ts:67-82 (registration)Registers the 'think' MCP tool: defines input schema, handler logic to record thought with timestamp in closure-based state, and returns success response.server.tool( "think", { thought: z.string().min(1, "Thought cannot be empty").describe("The thought content to record") }, async ({ thought }) => { thoughts.push({ timestamp: new Date().toISOString(), content: thought }); return { content: [{ type: "text", text: "Thought recorded successfully" }] }; } );
- src/mcp/think.ts:70-81 (handler)The core handler function for the 'think' tool that appends the user-provided thought to an internal array with a timestamp and responds with a text confirmation.async ({ thought }) => { thoughts.push({ timestamp: new Date().toISOString(), content: thought }); return { content: [{ type: "text", text: "Thought recorded successfully" }] }; }
- src/mcp/think.ts:69-69 (schema)Zod schema for 'think' tool input: requires a non-empty string 'thought'.{ thought: z.string().min(1, "Thought cannot be empty").describe("The thought content to record") },
- src/index.ts:25-25 (registration)Top-level call to register the 'think' tool (and others) on the MCP server instance.registerThinkTool(server);
- src/mcp/think.ts:20-60 (helper)Supporting class with methods to manage thoughts (add, retrieve, clear, stats), maintained for testing but registration uses closure state instead.export class ThinkToolInternalLogic { thoughts: Thought[] = []; // Make public for test access if needed, or add methods addThought(content: string): void { this.thoughts.push({ timestamp: new Date().toISOString(), content }); } getAllThoughts(): Thought[] { return [...this.thoughts]; } clearThoughts(): void { this.thoughts = []; } getThoughtStats(): ThoughtStats { const totalThoughts = this.thoughts.length; if (totalThoughts === 0) { return { totalThoughts: 0, averageLength: 0, oldestThought: null, newestThought: null }; } const averageLength = this.thoughts.reduce((acc, thought) => acc + thought.content.length, 0) / totalThoughts; return { totalThoughts, averageLength: parseFloat(averageLength.toFixed(2)), // Keep formatted oldestThought: this.thoughts[0].timestamp, newestThought: this.thoughts[this.thoughts.length - 1].timestamp }; } }