Project snapshot
What I owned
I owned the complete path from an open-ended customer request to a delivered product.
The initial request
“Build an MCP server for investors.”
Customer request, in full
The request named a technology, but it did not define a product. Three questions were still unanswered:
- What work were investors trying to complete with an LLM?
- Which of those workflows could the customer’s existing data support?
- How could an LLM client access the right company’s data without breaking the customer’s security model?
Building a generic wrapper around the platform API would have produced tools, but not necessarily a product anyone needed.
Discovery: from user work to product scope
I started with users rather than endpoints. I interviewed 3 VC investors about:
- The investment tasks they performed repeatedly.
- How they already used LLMs in their work.
- Where they copied information between the platform, documents and an LLM.
- Which questions required searching across portfolio, reporting, fund or notification data.
I then checked each candidate workflow against the data the customer platform actually held. This removed ideas that sounded useful but could not be supported reliably, and turned user needs into a concrete product specification.
| Capability | Workflow served | Build order |
|---|---|---|
| Reporting collection status | Check which company reports have or have not been collected | 1 · user pre-test |
| Review-status briefing | Summarise the current status of portfolio reviews | 2 · user pre-test |
| Fund performance and capital | Retrieve fund performance and capital information | 3 · user pre-test |
| Portfolio search | Find companies and portfolio information through natural-language requests | Completed |
| Risk-grade movement | Identify and explain changes in company risk grades | Completed |
| Notification triage | Find and prioritise platform notifications that need attention | Completed |
The order came from observed user value, not API convenience. All six capabilities were subsequently completed.
Constraints that shaped the system
- The system had to work when users connected the MCP server from Claude or GPT, including the CLI workflow identified during research.
- MCP tool calls did not carry an ordinary browser session.
- The customer already had an authentication system that had to remain authoritative.
- One investor could belong to multiple companies.
- Every tool call had to use the correct company context and preserve company-level data isolation.
- A capability was only valid if the existing customer platform held the data required to answer it.
- The server had to integrate with existing APIs rather than duplicate portfolio data in a separate system.
Key decisions
01Design for the MCP clients users actually used
Early discussion assumed a desktop-only LLM experience. User research showed the system needed to work through the Claude or GPT clients users actually connected to MCP, including their CLI workflow. I designed the product around that environment instead of preserving the original assumption.
This changed the interaction model, the authentication path, and the way tool results needed to be returned.
02Define tools around workflows, not API endpoints
The customer platform exposed 115 endpoints, but endpoint coverage was not the goal. I grouped data and actions around tasks investors were trying to complete, then exposed those workflows as six capabilities.
This kept the MCP server from becoming a thin, difficult-to-use mirror of the existing API.
03Reuse the customer’s authentication system
I rejected a separate credential store for the MCP server. It would have duplicated identity data, created another security boundary, and made account changes harder to keep consistent.
Instead, connecting the MCP server from Claude or GPT routes the user through the customer’s own login. The MCP server then uses the verified customer identity and memberships without introducing a second account system.
Reusing the customer’s identity system does not remove the risk — it moves it to the token. I diagnosed the access-control gaps in the client’s service flow and implemented PKCE on the authorisation code exchange with a Fernet-encrypted DiskStore for the resulting tokens, so a stolen disk or a leaked session does not become a usable credential.
04Make company context a first-class part of every request
An authenticated user was not enough to identify the correct data scope, because one investor could belong to multiple companies. The server also had to know which company the user intended to work with.
I designed two ways to establish that context: infer a company from the user’s request when an explicit company keyword is present, and provide an explicit callable company-switching capability when the user needs to change or confirm context. The selected company context is then passed through to downstream tool handlers and customer APIs.
05Prioritise with users before completing the full tool set
The six capabilities were not treated as equally urgent. A user pre-test identified reporting collection status as the first workflow to implement, with review briefing and fund performance next.
This gave the build a defensible order and created an earlier path to validating real value.
Service architecture
Authentication and company switching
This was the hardest integration problem in the project. The product could have six useful tools and still fail if authentication or company context was unreliable.
The user connects the MCP server
From Claude or GPT — including the CLI workflow surfaced during research.
The MCP client reaches the server
The tool call carries no ordinary browser session, so identity cannot be assumed from a cookie.
The connection routes through the customer’s existing login
No second credential store. The customer’s system stays the authority on who this person is.
The server receives a verified identity
Verified by the customer, not minted by me.
The server retrieves the companies available to that user
One investor can belong to several companies, so a single identity is not yet a data scope.
A company is selected
Either inferred from an explicit company keyword in the request, or set through the company-switching tool.
The tool handler calls the platform API within that company scope
The context travels with the request instead of being re-derived per handler.
The result returns without exposing another company’s data
Company-level isolation is a property of the request path, not a filter applied at the end.
One workflow, end to end
A worked example of the reporting-collection-status capability — the workflow users ranked first. Values are substituted; no customer data appears here.
The same request under a different company context returns a different set — and never both. Company isolation is enforced on the path to the API, not by trimming the response.
Implementation
My work combined product scoping and hands-on server development:
- Interviewed 3 VC investors about their workflows and LLM usage.
- Mapped candidate tasks against 115 platform API endpoints and available data.
- Defined six capabilities and prioritised them through a user pre-test.
- Specified the Claude / GPT MCP interaction model and tool surface.
- Designed the server architecture and customer authentication integration.
- Implemented company membership lookup and context switching.
- Wrote the MCP server and all six workflow handlers.
- Completed the customer-login and multi-company context integration.
- Tested and delivered the finished system within two months.
Outcome — and what this case does not claim
Delivered
- An open-ended MCP request converted into six implemented investment workflows.
- 115 platform endpoints analysed against user needs and available data.
- Build order established through pre-testing with 3 VC investors.
- The customer’s own login works when connecting the MCP server from Claude or GPT.
- Authentication, company switching and company-level data isolation completed as core system behaviour.
- The full two-month project completed solo as a paid customer delivery.
Delivery status
- Product definition, server implementation, six workflows, customer login and multi-company context are complete.
- The customer project is finished and delivered.
Not claimed
- Post-delivery usage metrics were not part of the project and are not claimed here.
- Customer satisfaction was not measured as part of the engagement.
What I learned
When a customer asks for a technology, the product still has to be discovered. The useful specification came from the intersection of three things: the user’s workflow, the data the platform actually held, and the security model the customer already operated.
The feature list was only one part of the system. Authentication and company context had to be treated as product behaviour from the beginning, because they determined whether every workflow result could be trusted.
Diagrams are drawn from the real systems and redrawn here; customer names, data and identifiers are removed.