How to Use an MCP Server for Product Design
A practical guide to the Model Context Protocol and how Intent's MCP server gives Claude Code direct access to your product specs.
You've written a detailed product spec. Your data models are defined. Your API contracts are documented. Your user stories have acceptance criteria. But when you open Claude Code and start building, the AI has no idea any of this exists.
This is the disconnect that the Model Context Protocol (MCP) solves. MCP lets AI tools like Claude Code connect directly to external systems, including your product specs, so that the AI has access to your design decisions as persistent context while it writes code.
This article explains what MCP is, how MCP servers work, and how to set up Intent's MCP server so Claude Code can read your specs while you build.
What Is MCP and Why Does It Matter
The Model Context Protocol is an open standard created by Anthropic that defines how AI applications communicate with external data sources and tools. Think of it as a USB-C port for AI: a standardized interface that lets any AI client connect to any compatible server.
Before MCP, giving an AI tool access to external data required custom integrations. Each tool had its own plugin system, its own API format, its own authentication flow. If you wanted Claude Code to access your project management tool, your documentation system, and your spec tool, you'd need three separate integrations.
MCP standardizes this. An MCP server exposes data and functionality through a defined protocol. Any MCP client (like Claude Code, Cursor, or other AI tools that support the standard) can connect to any MCP server and immediately use its capabilities.
The protocol defines three types of capabilities a server can expose:
- Resources: Read-only data the AI can access, like documents, specs, or configuration files.
- Tools: Actions the AI can execute, like creating a ticket, running a query, or checking implementation status.
- Prompts: Pre-defined prompt templates that help the AI use the server's capabilities effectively.
The Problem of Disconnected Product Knowledge
Most teams keep their product knowledge in scattered locations: specs in Google Docs, user stories in Jira, data models on a whiteboard photo, API contracts in a Confluence page, architecture decisions in an ADR folder that nobody remembers exists.
When a developer sits down to implement a feature, they have to manually gather context from all these sources. When they use an AI coding tool, the context problem is even worse, because the AI can only work with what it's explicitly given.
The typical workflow looks like this:
- Developer reads the spec in Google Docs.
- Developer opens Claude Code.
- Developer manually copies relevant parts of the spec into the prompt.
- Claude Code generates code based on the pasted context.
- Developer realizes they forgot to include the error response format.
- Developer goes back to the spec, copies more context, re-prompts.
This manual context-shuttling is slow, error-prone, and defeats the purpose of having a structured spec in the first place. The spec exists, but the AI tool can't see it.
MCP eliminates this gap. When your specs live in a system with an MCP server, Claude Code can read them directly. No copying. No pasting. No context lost in translation.
How MCP Servers Work
An MCP server is a lightweight process that communicates with AI clients using the MCP protocol. The most common transport is stdio (standard input/output), where the server runs as a subprocess of the AI client and they communicate through stdin/stdout using JSON-RPC messages.
Here's the basic architecture:
Claude Code (MCP Client)
|
| stdin/stdout (JSON-RPC)
|
MCP Server Process
|
| HTTP/API calls
|
External System (Intent, database, etc.)
When Claude Code starts and an MCP server is configured, it launches the server process and queries it for available tools and resources. The server responds with a list of capabilities. From that point forward, Claude Code can call those tools and read those resources as part of its normal workflow.
A simplified MCP tool definition looks like this:
{
"name": "get_project_spec",
"description": "Retrieve the complete specification for a project, including features, user stories, data models, and API contracts",
"inputSchema": {
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "The ID of the project to retrieve the spec for"
}
},
"required": ["project_id"]
}
}
When Claude Code decides it needs the project spec (either because you asked for it or because it determines the context would be helpful), it calls this tool. The MCP server handles the request, fetches the data from the external system, and returns it to Claude Code as structured content.
Intent's MCP Server Capabilities
Intent's MCP server exposes your product specs and project metadata to Claude Code through several tools:
Reading Project Specifications
The primary tool retrieves the full specification for a project. This includes features, user stories, data models, API endpoints, and architecture decisions, everything defined in your Intent project.
// Claude Code can call this tool to get the full spec
{
tool: "get_project_spec",
arguments: {
project_id: "proj_abc123"
}
}
// Returns structured spec data:
{
project: {
name: "Acme Platform",
features: [...],
user_stories: [...],
data_models: [...],
api_endpoints: [...],
architecture: [...]
}
}
When Claude Code has this context, it can generate code that matches your spec exactly: correct field names, correct validation rules, correct API response formats, correct error handling.
Listing Projects and Features
The server provides tools to list available projects and their features, so Claude Code can discover what specs are available and navigate to the right context.
// List all projects in the organization
{ tool: "list_projects" }
// List features within a project
{
tool: "list_features",
arguments: { project_id: "proj_abc123" }
}
Checking Implementation Status
One of the more powerful capabilities is checking whether a spec has been implemented. The server can compare your specification against your actual codebase to identify gaps.
// Check implementation status for a feature
{
tool: "check_implementation_status",
arguments: {
project_id: "proj_abc123",
feature_id: "feat_xyz789"
}
}
// Returns:
{
feature: "User Authentication",
status: "partial",
implemented: [
"POST /api/v1/auth/login",
"POST /api/v1/auth/register"
],
missing: [
"POST /api/v1/auth/forgot-password",
"POST /api/v1/auth/reset-password"
]
}
This lets you ask Claude Code things like "what parts of the spec haven't been implemented yet?" and get an accurate, up-to-date answer.
Setting Up Intent's MCP Server
Setting up the MCP server takes a few minutes. Here's the step-by-step process.
Step 1: Get Your API Key
In Intent, navigate to your organization settings and generate an API key. This key authenticates the MCP server with your Intent account.
Step 2: Configure Claude Code
Claude Code reads MCP server configuration from its settings file. Add Intent's MCP server to your project-level configuration by creating or editing .mcp.json in your project root:
{
"mcpServers": {
"intent": {
"command": "npx",
"args": ["-y", "@anthropic/intent-mcp-server"],
"env": {
"INTENT_API_KEY": "your-api-key-here"
}
}
}
}
Alternatively, you can add it to your global Claude Code configuration so it's available in all projects.
Step 3: Verify the Connection
Restart Claude Code (or reload the window if using an IDE integration). Claude Code will automatically start the MCP server and discover its tools. You can verify by asking Claude Code:
What MCP tools are available?
You should see the Intent tools listed, including get_project_spec, list_projects, and check_implementation_status.
Step 4: Link Your Project
If your Intent project isn't automatically detected, you can tell Claude Code which project to use:
Use the Intent project "Acme Platform" for spec context.
Claude Code will use the MCP server to fetch the project details and keep them as context for the rest of the session.
Example Workflow: Building a Feature With MCP
Here's what a realistic development session looks like when Claude Code has access to your specs through MCP.
Starting the Feature
You open Claude Code and say:
I need to implement the "Team Invitations" feature.
Pull the spec from Intent first.
Claude Code calls the MCP server, retrieves the spec for the Team Invitations feature, and now has full context: the data model for invitations, the API endpoints, the user flows, the error states, and the acceptance criteria.
Generating the Backend
You continue:
Generate the API endpoint for creating an invitation based on the spec.
Claude Code doesn't need you to explain the fields, validation rules, or response format. It already has them from the spec. It generates:
@router.post("/api/v1/teams/{team_id}/invitations", status_code=201)
async def create_invitation(
team_id: UUID,
request: CreateInvitationRequest,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
# Verify user is team owner or admin
team_member = await team_repo.get_member(db, team_id, current_user.id)
if not team_member or team_member.role not in ["owner", "admin"]:
raise HTTPException(status_code=403, detail="Not authorized to invite members")
# Check if user is already a member
existing = await team_repo.get_member_by_email(db, team_id, request.email)
if existing:
raise HTTPException(status_code=409, detail="User is already a team member")
# Check for pending invitation
pending = await invitation_repo.get_pending_by_email(db, team_id, request.email)
if pending:
raise HTTPException(status_code=409, detail="An invitation has already been sent to this email")
invitation = await invitation_repo.create(
db,
team_id=team_id,
email=request.email,
role=request.role or "member",
invited_by=current_user.id,
)
await send_invitation_email(invitation)
return InvitationResponse.model_validate(invitation)
The field names, error messages, status codes, and business logic all match the spec, because Claude Code read the spec through MCP before generating the code.
Checking Progress
Midway through implementation, you ask:
What parts of the Team Invitations feature still need to be implemented?
Claude Code calls check_implementation_status through the MCP server and reports:
Based on the spec, the following are still missing:
- DELETE /api/v1/teams/{team_id}/invitations/{id} (cancel invitation)
- POST /api/v1/invitations/{token}/accept (accept invitation)
- Frontend: Invitation management page
- Frontend: Accept invitation flow
This keeps you aligned with the spec without manually tracking progress.
When MCP Makes the Biggest Difference
MCP provides value in any project, but the impact is most significant in specific situations:
Multi-developer teams. When multiple developers are implementing different parts of the same feature, MCP ensures they all work from the same spec. The API developer and the frontend developer get identical context.
Long-running features. For features that take days or weeks to implement, the spec serves as persistent memory across Claude Code sessions. You don't have to re-explain the context every time you start a new session.
Onboarding. New team members can ask Claude Code to explain any part of the system, and the AI can pull the spec to give accurate, up-to-date answers rather than hallucinating based on partial code analysis.
Verification. After implementation, you can ask Claude Code to compare what was built against what was specified, catching drift before it becomes a problem.
Beyond Reading: The Future of Spec-Connected AI
Today, MCP servers primarily provide read access to specs. But the protocol supports bidirectional communication. Future capabilities could include AI tools that update specs based on implementation discoveries, flag spec-code divergence automatically, or suggest spec modifications when new requirements emerge.
The core idea remains the same: your product specifications shouldn't be passive documents that developers read once and forget. They should be living, connected artifacts that your AI tools can access, reference, and act on throughout the entire development lifecycle.
MCP is the protocol that makes this connection possible. Intent provides the structured specs worth connecting to. Together, they close the gap between what you intend to build and what you actually build.