@houtini/fmp-mcp 1.0.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/HANDOVER.md +627 -0
- package/LICENSE +21 -0
- package/README.md +240 -0
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +302 -0
- package/build/index.js.map +1 -0
- package/package.json +40 -0
- package/src/index.ts +342 -0
- package/test-server.js +34 -0
- package/tsconfig.json +19 -0
package/HANDOVER.md
ADDED
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
# FMP MCP Server Development - Handover Document
|
|
2
|
+
**Project:** Building Stdio-Based Financial Modeling Prep MCP Server
|
|
3
|
+
**Date:** December 14, 2025
|
|
4
|
+
**Status:** Server Built, Needs Testing & Article Creation
|
|
5
|
+
**Location:** `C:\dev\fmp-mcp\`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## EXECUTIVE SUMMARY
|
|
10
|
+
|
|
11
|
+
Started with tutorial article creation about adding MCP servers to Claude Desktop. Hit architectural incompatibility with `financial-modeling-prep-mcp-server` npm package (HTTP-based, not stdio). **Decision: Build our own stdio-based FMP MCP server from scratch.**
|
|
12
|
+
|
|
13
|
+
**Current state:** Server built and configured in Claude Desktop, needs testing and completion.
|
|
14
|
+
**Next thread goal:** Test server, complete implementation, publish package, write tutorial article.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## PROJECT CONTEXT
|
|
19
|
+
|
|
20
|
+
### Original Goal
|
|
21
|
+
Write beginner-friendly tutorial: "How to Add MCP Servers to Claude Desktop"
|
|
22
|
+
|
|
23
|
+
### What Happened
|
|
24
|
+
1. ✅ Found FMP package on npm (`financial-modeling-prep-mcp-server`)
|
|
25
|
+
2. ❌ Package is HTTP-based (requires port 8080, logs to stdout)
|
|
26
|
+
3. ❌ Incompatible with Claude Desktop's stdio transport
|
|
27
|
+
4. ✅ **Pivoted:** Build custom stdio-based FMP MCP server
|
|
28
|
+
5. ✅ Server built, configured, ready for testing
|
|
29
|
+
|
|
30
|
+
### Why This Matters
|
|
31
|
+
- HTTP MCP servers ≠ stdio MCP servers (different transports)
|
|
32
|
+
- Claude Desktop expects stdio (JSON-RPC over stdin/stdout)
|
|
33
|
+
- HTTP servers need separate process + port management
|
|
34
|
+
- **This debugging journey IS the article content**
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## CURRENT PROJECT STATE
|
|
39
|
+
|
|
40
|
+
### Repository: `C:\dev\fmp-mcp\`
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
C:\dev\fmp-mcp\
|
|
44
|
+
├── .git/ # Git repository
|
|
45
|
+
├── .gitignore # Node/build ignores
|
|
46
|
+
├── build/ # Compiled TypeScript
|
|
47
|
+
│ ├── index.js # ✅ Main entry point
|
|
48
|
+
│ ├── index.d.ts # Type declarations
|
|
49
|
+
│ └── *.map # Source maps
|
|
50
|
+
├── node_modules/ # Dependencies installed
|
|
51
|
+
├── src/
|
|
52
|
+
│ └── index.ts # ✅ TypeScript source (342 lines)
|
|
53
|
+
├── LICENSE # MIT license
|
|
54
|
+
├── package.json # ✅ Package configuration
|
|
55
|
+
├── package-lock.json
|
|
56
|
+
├── README.md # ⚠️ Needs rewrite in Richard's style
|
|
57
|
+
└── tsconfig.json # TypeScript config
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Implementation Status
|
|
61
|
+
|
|
62
|
+
**✅ COMPLETED:**
|
|
63
|
+
- TypeScript MCP server with stdio transport
|
|
64
|
+
- 7 core FMP API tools implemented
|
|
65
|
+
- Error handling and type safety
|
|
66
|
+
- Build configuration (tsc)
|
|
67
|
+
- Claude Desktop integration configured
|
|
68
|
+
- Git repository initialized
|
|
69
|
+
|
|
70
|
+
**⚠️ NEEDS WORK:**
|
|
71
|
+
1. **Server Testing** - Has NOT been tested yet
|
|
72
|
+
2. **Tool Expansion** - Only 7 tools (FMP API has 250+)
|
|
73
|
+
3. **README Rewrite** - Must match Richard's voice
|
|
74
|
+
4. **Package Publishing** - npm publish workflow
|
|
75
|
+
5. **Tutorial Article** - Document the entire journey
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## IMPLEMENTED TOOLS (7 Core)
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
1. get_quote // Real-time stock quotes
|
|
83
|
+
2. search_symbol // Search by company name/ticker
|
|
84
|
+
3. get_company_profile // Detailed company info
|
|
85
|
+
4. get_income_statement // Income statements (annual/quarterly)
|
|
86
|
+
5. get_balance_sheet // Balance sheet data
|
|
87
|
+
6. get_cash_flow // Cash flow statements
|
|
88
|
+
7. get_stock_news // Latest stock news
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**API Pattern:**
|
|
92
|
+
```typescript
|
|
93
|
+
async function fetchFMP(endpoint: string): Promise<any> {
|
|
94
|
+
const url = `${FMP_BASE_URL}${endpoint}?apikey=${FMP_API_KEY}`;
|
|
95
|
+
const response = await fetch(url);
|
|
96
|
+
return response.json();
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## CLAUDE DESKTOP CONFIGURATION
|
|
103
|
+
|
|
104
|
+
**File:** `C:\Users\Richard Baxter\AppData\Roaming\Claude\claude_desktop_config.json`
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
"financial-modeling-prep": {
|
|
108
|
+
"command": "node",
|
|
109
|
+
"args": [
|
|
110
|
+
"C:\\dev\\fmp-mcp\\build\\index.js"
|
|
111
|
+
],
|
|
112
|
+
"env": {
|
|
113
|
+
"FMP_API_KEY": "4bqSxSXvO3TBUszm6VqRMKszhq5M0SmF"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Expected Behavior:**
|
|
119
|
+
- Claude Desktop starts Node.js process
|
|
120
|
+
- Runs `build/index.js` with stdio transport
|
|
121
|
+
- Provides 7 FMP tools to Claude
|
|
122
|
+
- Logs to stderr (not stdout, per MCP spec)
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## CRITICAL DEBUGGING DISCOVERIES
|
|
127
|
+
|
|
128
|
+
### 1. HTTP vs Stdio Architecture Mismatch
|
|
129
|
+
**Problem:** `financial-modeling-prep-mcp-server` package runs HTTP server on port 8080
|
|
130
|
+
**Evidence:**
|
|
131
|
+
```
|
|
132
|
+
Error: listen EADDRINUSE: address already in use :::8080
|
|
133
|
+
[FmpMcpServer] ❌ Server failed to start...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Root cause:** Package uses Smithery SDK for HTTP transport, not stdio
|
|
137
|
+
**Solution:** Built custom server with `@modelcontextprotocol/sdk` stdio transport
|
|
138
|
+
|
|
139
|
+
### 2. Console Logging to Stdout Breaks MCP
|
|
140
|
+
**Problem:** HTTP server logs `[FmpMcpServer]` prefix to stdout
|
|
141
|
+
**Evidence:**
|
|
142
|
+
```
|
|
143
|
+
Unexpected token 'F', "[FmpMcpServ"... is not valid JSON
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Why it breaks:** MCP protocol expects **pure JSON-RPC on stdout**
|
|
147
|
+
**Fix:** All logs go to stderr (`console.error()`)
|
|
148
|
+
|
|
149
|
+
### 3. NODE_ENV=production Blocks DevDependencies
|
|
150
|
+
**Problem:** TypeScript wouldn't compile (`@types/node` missing)
|
|
151
|
+
**Evidence:**
|
|
152
|
+
```
|
|
153
|
+
error TS2580: Cannot find name 'process'
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Root cause:** `NODE_ENV=production` set in environment
|
|
157
|
+
**Fix:** `npm install --include=dev` forces devDependency installation
|
|
158
|
+
|
|
159
|
+
### 4. Port Conflict from Orphaned Process
|
|
160
|
+
**Problem:** Port 8080 already in use
|
|
161
|
+
**Evidence:** `netstat -ano | findstr :8080` showed PID 37312 (node.exe)
|
|
162
|
+
**Fix:** `taskkill /F /PID 37312`
|
|
163
|
+
|
|
164
|
+
### 5. Windows chmod Incompatibility
|
|
165
|
+
**Problem:** Build script used Unix `chmod +x`
|
|
166
|
+
**Fix:** Removed from package.json build script (Windows doesn't need it)
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## ARTICLE OUTLINE (To Be Written)
|
|
171
|
+
|
|
172
|
+
### Title Options
|
|
173
|
+
1. "Building a Financial Data MCP Server for Claude: A Debugging Journey"
|
|
174
|
+
2. "When npm Packages Don't Work: Converting HTTP MCP to Stdio"
|
|
175
|
+
3. "From HTTP to Stdio: Making Financial Modeling Prep Work with Claude Desktop"
|
|
176
|
+
|
|
177
|
+
### Article Structure (Based on Writing Style Guide)
|
|
178
|
+
|
|
179
|
+
**Opening (Personal Context):**
|
|
180
|
+
- Started writing tutorial, hit architectural wall
|
|
181
|
+
- "This was supposed to be a simple how-to guide..."
|
|
182
|
+
- Honest assessment: package looked perfect but fundamentally incompatible
|
|
183
|
+
|
|
184
|
+
**Problem Discovery (Technical Depth):**
|
|
185
|
+
- Log file investigation (`AppData\Roaming\Claude\logs\`)
|
|
186
|
+
- JSON parsing errors → stdout pollution diagnosis
|
|
187
|
+
- Port conflicts → architecture realization
|
|
188
|
+
- Node.js process debugging with netstat/tasklist
|
|
189
|
+
|
|
190
|
+
**Decision Point (Engineering Rationale):**
|
|
191
|
+
- Why rebuild vs workaround?
|
|
192
|
+
- HTTP MCP servers vs stdio MCP servers (protocol differences)
|
|
193
|
+
- @modelcontextprotocol/sdk documentation deep dive
|
|
194
|
+
- Trade-offs: control vs time investment
|
|
195
|
+
|
|
196
|
+
**Implementation (Step-by-Step with Mistakes):**
|
|
197
|
+
- TypeScript project setup
|
|
198
|
+
- MCP SDK integration (stdio transport)
|
|
199
|
+
- FMP API wrapper implementation
|
|
200
|
+
- NODE_ENV=production gotcha (devDependencies)
|
|
201
|
+
- Windows compatibility fixes (chmod)
|
|
202
|
+
|
|
203
|
+
**Testing (Next Thread Work):**
|
|
204
|
+
- Claude Desktop restart and verification
|
|
205
|
+
- Tool execution tests (get_quote, search_symbol)
|
|
206
|
+
- Error handling validation
|
|
207
|
+
- Token usage monitoring
|
|
208
|
+
|
|
209
|
+
**Lessons Learned:**
|
|
210
|
+
- MCP transport types matter (HTTP ≠ stdio)
|
|
211
|
+
- Log pollution breaks JSON-RPC protocols
|
|
212
|
+
- Environment variables have silent effects
|
|
213
|
+
- npm package architecture requires verification
|
|
214
|
+
- Building from scratch sometimes faster than debugging
|
|
215
|
+
|
|
216
|
+
**Resources:**
|
|
217
|
+
- GitHub repository link
|
|
218
|
+
- npm package link (after publishing)
|
|
219
|
+
- MCP SDK documentation
|
|
220
|
+
- FMP API reference
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## NEXT THREAD TASKS (Priority Order)
|
|
225
|
+
|
|
226
|
+
### 1. **TEST THE SERVER** (CRITICAL - DO THIS FIRST)
|
|
227
|
+
```
|
|
228
|
+
Restart Claude Desktop (already done)
|
|
229
|
+
Test: "Get me a stock quote for AAPL using the Financial Modeling Prep server"
|
|
230
|
+
Test: "Search for Tesla stock symbol"
|
|
231
|
+
Test: "Get Apple's company profile"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Expected output:** JSON data from FMP API
|
|
235
|
+
**If fails:** Check logs at `C:\Users\Richard Baxter\AppData\Roaming\Claude\logs\mcp-server-financial-modeling-prep.log`
|
|
236
|
+
|
|
237
|
+
### 2. **Verify All 7 Tools Work**
|
|
238
|
+
- get_quote → Symbol: AAPL, TSLA, MSFT
|
|
239
|
+
- search_symbol → Query: "Apple", "Tesla"
|
|
240
|
+
- get_company_profile → Symbol: AAPL
|
|
241
|
+
- get_income_statement → Symbol: AAPL, period: annual
|
|
242
|
+
- get_balance_sheet → Symbol: AAPL, period: quarter
|
|
243
|
+
- get_cash_flow → Symbol: AAPL
|
|
244
|
+
- get_stock_news → Symbol: AAPL, limit: 5
|
|
245
|
+
|
|
246
|
+
### 3. **Expand Tool Coverage** (Optional but Valuable)
|
|
247
|
+
Current: 7 tools
|
|
248
|
+
FMP API has: 250+ endpoints
|
|
249
|
+
|
|
250
|
+
**High-value additions:**
|
|
251
|
+
```typescript
|
|
252
|
+
// Market indexes
|
|
253
|
+
get_sp500_constituents // S&P 500 companies
|
|
254
|
+
get_nasdaq_constituents // NASDAQ companies
|
|
255
|
+
|
|
256
|
+
// Analyst data
|
|
257
|
+
get_price_target // Analyst price targets
|
|
258
|
+
get_analyst_estimates // Earnings estimates
|
|
259
|
+
|
|
260
|
+
// Insider trading
|
|
261
|
+
get_insider_trading // Insider transactions
|
|
262
|
+
|
|
263
|
+
// Economic data
|
|
264
|
+
get_treasury_rates // Treasury yields
|
|
265
|
+
get_economic_calendar // Economic events
|
|
266
|
+
|
|
267
|
+
// Technical indicators
|
|
268
|
+
get_sma // Simple moving average
|
|
269
|
+
get_rsi // Relative strength index
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Implementation pattern:**
|
|
273
|
+
```typescript
|
|
274
|
+
{
|
|
275
|
+
name: 'get_sp500_constituents',
|
|
276
|
+
description: 'Get list of S&P 500 constituent companies',
|
|
277
|
+
inputSchema: {
|
|
278
|
+
type: 'object',
|
|
279
|
+
properties: {},
|
|
280
|
+
required: [],
|
|
281
|
+
},
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### 4. **Rewrite README in Richard's Voice**
|
|
286
|
+
|
|
287
|
+
**Current README:** Generic boilerplate
|
|
288
|
+
**Target:** Authentic, technical, transparent
|
|
289
|
+
|
|
290
|
+
**Style requirements (from writing_style.md):**
|
|
291
|
+
- 12.2 words/sentence average (±12.1 variance)
|
|
292
|
+
- British English (whilst, colour, optimise)
|
|
293
|
+
- First-person transparency (5+ statements)
|
|
294
|
+
- Equipment specificity ("my FMP API key" not "the API key")
|
|
295
|
+
- Honest caveats ("This isn't production-ready...")
|
|
296
|
+
- Community voice references
|
|
297
|
+
- Counter-intuitive insights
|
|
298
|
+
- Zero AI clichés (delve, leverage, unlock, seamless)
|
|
299
|
+
|
|
300
|
+
**README structure:**
|
|
301
|
+
```markdown
|
|
302
|
+
# Financial Modeling Prep MCP Server
|
|
303
|
+
|
|
304
|
+
Quick context: built this because the HTTP-based npm package didn't
|
|
305
|
+
play nicely with Claude Desktop's stdio transport. Spent a morning
|
|
306
|
+
debugging port conflicts before realising I'd save time just
|
|
307
|
+
rebuilding from scratch.
|
|
308
|
+
|
|
309
|
+
## What It Does
|
|
310
|
+
|
|
311
|
+
Stdio-based MCP server for Financial Modeling Prep API. Currently
|
|
312
|
+
supports 7 core tools (stock quotes, company profiles, financial
|
|
313
|
+
statements). The API has 250+ endpoints - these are just the ones
|
|
314
|
+
I needed first.
|
|
315
|
+
|
|
316
|
+
## Installation
|
|
317
|
+
|
|
318
|
+
[Clear, step-by-step with actual commands]
|
|
319
|
+
|
|
320
|
+
## Configuration
|
|
321
|
+
|
|
322
|
+
[Include FMP API key setup, Claude Desktop config]
|
|
323
|
+
|
|
324
|
+
## Tools
|
|
325
|
+
|
|
326
|
+
[List all 7 tools with examples]
|
|
327
|
+
|
|
328
|
+
## Limitations
|
|
329
|
+
|
|
330
|
+
[Honest assessment of what's NOT implemented]
|
|
331
|
+
|
|
332
|
+
## Development
|
|
333
|
+
|
|
334
|
+
[How to add more tools, test locally]
|
|
335
|
+
|
|
336
|
+
## Why Stdio Not HTTP?
|
|
337
|
+
|
|
338
|
+
[Technical explanation of transport incompatibility]
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 5. **Package Publishing Workflow**
|
|
342
|
+
|
|
343
|
+
**Steps:**
|
|
344
|
+
```bash
|
|
345
|
+
# 1. Update package.json metadata
|
|
346
|
+
npm version 1.0.0
|
|
347
|
+
|
|
348
|
+
# 2. Test build
|
|
349
|
+
npm run build
|
|
350
|
+
|
|
351
|
+
# 3. Test locally
|
|
352
|
+
node build/index.js
|
|
353
|
+
|
|
354
|
+
# 4. Publish to npm
|
|
355
|
+
npm publish --access public
|
|
356
|
+
|
|
357
|
+
# 5. Test installation
|
|
358
|
+
npx @houtini-dev/fmp-mcp
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**package.json updates needed:**
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"name": "@yourscope/fmp-mcp", // Change scope
|
|
365
|
+
"description": "Stdio MCP server for Financial Modeling Prep API - Claude Desktop integration",
|
|
366
|
+
"keywords": [
|
|
367
|
+
"mcp",
|
|
368
|
+
"financial-modeling-prep",
|
|
369
|
+
"claude",
|
|
370
|
+
"stdio",
|
|
371
|
+
"stock-market"
|
|
372
|
+
],
|
|
373
|
+
"repository": {
|
|
374
|
+
"type": "git",
|
|
375
|
+
"url": "https://github.com/yourusername/fmp-mcp.git"
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 6. **Write Tutorial Article**
|
|
381
|
+
|
|
382
|
+
**Format:** Technical guide with debugging journey
|
|
383
|
+
**Length:** 2,500-3,500 words
|
|
384
|
+
**Target audience:** Developers adding MCP servers to Claude Desktop
|
|
385
|
+
|
|
386
|
+
**Article sections:**
|
|
387
|
+
1. Introduction (personal context, what went wrong)
|
|
388
|
+
2. Problem discovery (logs, debugging, architecture)
|
|
389
|
+
3. Building the solution (step-by-step)
|
|
390
|
+
4. Testing and validation
|
|
391
|
+
5. Lessons learned
|
|
392
|
+
6. Resources and next steps
|
|
393
|
+
|
|
394
|
+
**Key learnings to highlight:**
|
|
395
|
+
- HTTP vs stdio transport types
|
|
396
|
+
- MCP protocol requirements (JSON-RPC on stdout)
|
|
397
|
+
- Environment variable gotchas (NODE_ENV)
|
|
398
|
+
- Windows compatibility considerations
|
|
399
|
+
- npm package architecture verification
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## TECHNICAL REFERENCE
|
|
404
|
+
|
|
405
|
+
### MCP SDK Usage Pattern
|
|
406
|
+
|
|
407
|
+
```typescript
|
|
408
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
409
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
410
|
+
|
|
411
|
+
const server = new Server(
|
|
412
|
+
{ name: 'fmp-mcp-server', version: '1.0.0' },
|
|
413
|
+
{ capabilities: { tools: {} } }
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
417
|
+
tools: TOOLS,
|
|
418
|
+
}));
|
|
419
|
+
|
|
420
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
421
|
+
// Handle tool execution
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
const transport = new StdioServerTransport();
|
|
425
|
+
await server.connect(transport);
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### FMP API Endpoints Reference
|
|
429
|
+
|
|
430
|
+
**Base URL:** `https://financialmodelingprep.com/api/v3`
|
|
431
|
+
**Auth:** `?apikey={FMP_API_KEY}` query parameter
|
|
432
|
+
|
|
433
|
+
**Implemented:**
|
|
434
|
+
```
|
|
435
|
+
/quote/{symbol} # Real-time quote
|
|
436
|
+
/search?query={query} # Symbol search
|
|
437
|
+
/profile/{symbol} # Company profile
|
|
438
|
+
/income-statement/{symbol}?period={period} # Income statement
|
|
439
|
+
/balance-sheet-statement/{symbol} # Balance sheet
|
|
440
|
+
/cash-flow-statement/{symbol} # Cash flow
|
|
441
|
+
/stock_news?tickers={symbol} # Stock news
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
**High-value endpoints to add:**
|
|
445
|
+
```
|
|
446
|
+
/sp500_constituent # S&P 500 list
|
|
447
|
+
/nasdaq_constituent # NASDAQ list
|
|
448
|
+
/price-target/{symbol} # Analyst targets
|
|
449
|
+
/analyst-estimates/{symbol} # Earnings estimates
|
|
450
|
+
/insider-trading?symbol={symbol} # Insider trades
|
|
451
|
+
/treasury # Treasury rates
|
|
452
|
+
/economic_calendar # Economic events
|
|
453
|
+
/technical_indicator/daily/{symbol} # Technical indicators
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### Error Handling Pattern
|
|
457
|
+
|
|
458
|
+
```typescript
|
|
459
|
+
try {
|
|
460
|
+
const data = await fetchFMP(`/quote/${symbol}`);
|
|
461
|
+
return {
|
|
462
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
463
|
+
};
|
|
464
|
+
} catch (error) {
|
|
465
|
+
return {
|
|
466
|
+
content: [{
|
|
467
|
+
type: 'text',
|
|
468
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
469
|
+
}],
|
|
470
|
+
isError: true,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## DEBUGGING CHECKLIST (If Issues Arise)
|
|
478
|
+
|
|
479
|
+
### Server Won't Start
|
|
480
|
+
```bash
|
|
481
|
+
# Check logs
|
|
482
|
+
type "C:\Users\Richard Baxter\AppData\Roaming\Claude\logs\mcp-server-financial-modeling-prep.log"
|
|
483
|
+
|
|
484
|
+
# Common issues:
|
|
485
|
+
# 1. Missing FMP_API_KEY → Check claude_desktop_config.json
|
|
486
|
+
# 2. Build directory missing → Run: npm run build
|
|
487
|
+
# 3. Syntax errors → Check: node build/index.js
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Tools Don't Appear in Claude
|
|
491
|
+
```bash
|
|
492
|
+
# 1. Restart Claude Desktop (required after config changes)
|
|
493
|
+
# 2. Check MCP server list in Claude settings
|
|
494
|
+
# 3. Verify process running: tasklist | findstr node
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### API Errors
|
|
498
|
+
```bash
|
|
499
|
+
# Test API key directly:
|
|
500
|
+
curl "https://financialmodelingprep.com/api/v3/quote/AAPL?apikey=4bqSxSXvO3TBUszm6VqRMKszhq5M0SmF"
|
|
501
|
+
|
|
502
|
+
# Common FMP errors:
|
|
503
|
+
# - 401: Invalid API key
|
|
504
|
+
# - 403: Rate limit exceeded (free tier: 250 requests/day)
|
|
505
|
+
# - 429: Too many requests
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### JSON Parsing Errors
|
|
509
|
+
```bash
|
|
510
|
+
# Check for stdout pollution:
|
|
511
|
+
node build/index.js
|
|
512
|
+
# Should output ONLY JSON-RPC, not log messages
|
|
513
|
+
|
|
514
|
+
# If logs appear on stdout → use console.error() not console.log()
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## FILE LOCATIONS REFERENCE
|
|
520
|
+
|
|
521
|
+
**Project:**
|
|
522
|
+
- Source: `C:\dev\fmp-mcp\src\index.ts`
|
|
523
|
+
- Build: `C:\dev\fmp-mcp\build\index.js`
|
|
524
|
+
- Package: `C:\dev\fmp-mcp\package.json`
|
|
525
|
+
- README: `C:\dev\fmp-mcp\README.md`
|
|
526
|
+
|
|
527
|
+
**Claude Desktop:**
|
|
528
|
+
- Config: `C:\Users\Richard Baxter\AppData\Roaming\Claude\claude_desktop_config.json`
|
|
529
|
+
- Logs: `C:\Users\Richard Baxter\AppData\Roaming\Claude\logs\mcp-server-financial-modeling-prep.log`
|
|
530
|
+
|
|
531
|
+
**FMP API:**
|
|
532
|
+
- Docs: https://site.financialmodelingprep.com/developer/docs
|
|
533
|
+
- API Key: `4bqSxSXvO3TBUszm6VqRMKszhq5M0SmF`
|
|
534
|
+
- Rate limits: 250 requests/day (free tier)
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
## SUCCESS CRITERIA
|
|
539
|
+
|
|
540
|
+
**Minimum Viable Product (Current Goal):**
|
|
541
|
+
- ✅ 7 core tools working
|
|
542
|
+
- ✅ Stdio transport verified
|
|
543
|
+
- ✅ Error handling functional
|
|
544
|
+
- ✅ Claude Desktop integration confirmed
|
|
545
|
+
|
|
546
|
+
**Enhanced Version (Next Iteration):**
|
|
547
|
+
- ⚠️ 20+ tools implemented
|
|
548
|
+
- ⚠️ README in Richard's voice
|
|
549
|
+
- ⚠️ Published to npm
|
|
550
|
+
- ⚠️ Tutorial article written
|
|
551
|
+
|
|
552
|
+
**Production Ready:**
|
|
553
|
+
- ❌ Comprehensive error handling
|
|
554
|
+
- ❌ Rate limiting logic
|
|
555
|
+
- ❌ Response caching
|
|
556
|
+
- ❌ Full API coverage (250+ tools)
|
|
557
|
+
- ❌ Unit tests
|
|
558
|
+
- ❌ CI/CD pipeline
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
## HANDOVER PROMPT FOR NEXT THREAD
|
|
563
|
+
|
|
564
|
+
```
|
|
565
|
+
Continue FMP MCP server development from C:\dev\fmp-mcp\
|
|
566
|
+
|
|
567
|
+
STATUS: Server built and configured, needs testing before article creation.
|
|
568
|
+
|
|
569
|
+
FIRST TASK: Test all 7 implemented tools:
|
|
570
|
+
1. get_quote (AAPL)
|
|
571
|
+
2. search_symbol ("Apple")
|
|
572
|
+
3. get_company_profile (AAPL)
|
|
573
|
+
4. get_income_statement (AAPL, annual)
|
|
574
|
+
5. get_balance_sheet (AAPL, quarter)
|
|
575
|
+
6. get_cash_flow (AAPL)
|
|
576
|
+
7. get_stock_news (AAPL, limit 5)
|
|
577
|
+
|
|
578
|
+
If tests pass → proceed to:
|
|
579
|
+
- Add high-value tools (analyst data, market indexes)
|
|
580
|
+
- Rewrite README in Richard's voice (British English, first-person, technical depth)
|
|
581
|
+
- Package for npm publishing
|
|
582
|
+
- Write tutorial article documenting the debugging journey
|
|
583
|
+
|
|
584
|
+
If tests fail → debug using logs at:
|
|
585
|
+
C:\Users\Richard Baxter\AppData\Roaming\Claude\logs\mcp-server-financial-modeling-prep.log
|
|
586
|
+
|
|
587
|
+
CONTEXT: Started as tutorial article, hit HTTP vs stdio incompatibility with
|
|
588
|
+
npm package, rebuilt from scratch. This debugging journey IS the article content.
|
|
589
|
+
|
|
590
|
+
Key discoveries: NODE_ENV=production, stdout pollution, port conflicts,
|
|
591
|
+
Windows chmod incompatibility - all documented in handover.
|
|
592
|
+
|
|
593
|
+
FMP API key: 4bqSxSXvO3TBUszm6VqRMKszhq5M0SmF (250 requests/day limit)
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## ARTICLE WRITING NOTES
|
|
599
|
+
|
|
600
|
+
### Voice Calibration Checklist
|
|
601
|
+
- ✅ British English throughout (whilst, colour, optimise)
|
|
602
|
+
- ✅ First-person transparency ("I spent 2 hours debugging...")
|
|
603
|
+
- ✅ Equipment specificity ("my FMP API key" not "the key")
|
|
604
|
+
- ✅ Honest mistakes included ("Took me too long to realise...")
|
|
605
|
+
- ✅ Average sentence: 12.2 words (variable lengths natural)
|
|
606
|
+
- ✅ Community references ("What I've read on r/ClaudeAI...")
|
|
607
|
+
- ✅ Counter-intuitive insights (HTTP ≠ stdio not obvious)
|
|
608
|
+
- ❌ Zero AI clichés (delve, leverage, unlock, seamless)
|
|
609
|
+
- ❌ No em dashes (use hyphens or commas)
|
|
610
|
+
- ❌ No perfect narratives (include failures)
|
|
611
|
+
|
|
612
|
+
### Technical Depth Requirements
|
|
613
|
+
- Engineering rationale for decisions (WHY stdio not just WHAT)
|
|
614
|
+
- Real-world comparisons (HTTP MCP vs stdio MCP architecture)
|
|
615
|
+
- Specific technical details (JSON-RPC protocol, stdout requirements)
|
|
616
|
+
- Counter-intuitive findings (console.log breaks MCP, NODE_ENV blocks deps)
|
|
617
|
+
- Community consensus references (MCP SDK best practices)
|
|
618
|
+
|
|
619
|
+
### Content Structure (Per Templates)
|
|
620
|
+
**Problem → Investigation → Solution → Lessons**
|
|
621
|
+
|
|
622
|
+
Not: "Here's how to build an MCP server"
|
|
623
|
+
But: "Here's what broke, how I debugged it, and what I learned"
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
**END OF HANDOVER**
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Houtini AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|