Pet lab interpretation for your app or agent
Furva explains dog and cat lab results in easy to understand language, over the Model Context Protocol.
https://mcp.furva.ai/functions/v1/mcpWhat Furva does
Send a dog or cat lab result and Furva returns, for each value, whether it is within the reference range, what the marker measures, and Questions To Ask Your Vet. It is educational only: it never diagnoses and never recommends treatment, and every answer carries that disclaimer.
Get a free key
Your first 5 completed interpretations are free, one time per account, then $3 each. Sign in with your email to create a key.
Get a free keyAuthentication
Furva supports two ways in. Pick the one that matches who your users are.
OAuth 2.1
Assistants such as ChatGPT and Claude connect with OAuth: the pet owner signs in to Furva and approves access, and the assistant then works with that owner's own pets and reports. Discovery follows the MCP authorization spec. An unauthenticated request gets a 401 whose WWW-Authenticate header points to the protected resource metadata. The live documents:
- Protected resource metadata (RFC 9728)
- Authorization server metadata
- Server description (mcp.json)
- Server card
The OAuth path is free for pet owners and is not part of developer pricing.
API keys
Your own app or agent uses an API key. Keys start with fmcp_ and go in the Authorization header on every request:
Authorization: Bearer FMCP_KEY- 5 completed interpretations free per account, one time, then $3 each.
- 60 tool calls per minute per key.
Keys see three tools: interpret_lab_report, get_biomarker_info and suggest_retest_timing. That is exactly what the server's tools/list returns. If your client also shows a tool named mcp_auth, it comes from the client's own sign-in handling, not from Furva, and you can ignore it.
Errors
Errors are JSON with an error field you can branch on:
unauthorized or invalid_api_keyThe Authorization header is missing, or the key is wrong or revoked. Check the header and the key on your keys page.
{
"error": "invalid_api_key",
"message": "Missing, invalid or revoked credentials."
}rate_limitedMore than 60 tool calls in a minute on this key. Wait for the number of seconds in the Retry-After header, then retry.
{
"error": "rate_limited",
"message": "Rate limit of 60 tool calls per minute reached.",
"retry_after_seconds": 12
}quota_exceededThe account has used its free completed interpretations. The allowance is one time and does not reset, so retrying will not help. The body carries the price and the upgrade path.
{
"error": "quota_exceeded",
"message": "This account has used its 5 free completed interpretations.",
"plan": "free",
"billable_unit": "completed_interpretation",
"billable_unit_description": "One interpret_lab_report call that returns a summary. get_biomarker_info and suggest_retest_timing are included and never charged.",
"free_quota": 5,
"used": 5,
"price_per_interpretation": { "amount": 3, "currency": "USD" },
"upgrade_url": "https://app.furva.ai/developers/pricing",
"support_email": "support@furva.ai"
}Connect a client
Replace FMCP_KEY with your key in each sample. Keep the word Bearer and the space after it.
- In Claude, open Customize, then Connectors, and choose Add custom connector. On Team and Enterprise plans an owner does this under Organization settings, then Connectors.
- Name it Furva and enter the MCP server URL above.
- To use your API key, set Authentication to No sign-in, open Request headers, choose authorization and enter the value below, including Bearer. Request headers are in beta in Claude and may not appear for every organization yet.
- Without a key, leave the detected sign-in option on. Each person then signs in to their own Furva account with OAuth.
- Select Add, then turn Furva on for a conversation from the Connectors menu.
Bearer FMCP_KEYAdd this to .cursor/mcp.json in your project, or ~/.cursor/mcp.json for every project.
{
"mcpServers": {
"furva": {
"url": "https://mcp.furva.ai/functions/v1/mcp",
"headers": {
"Authorization": "Bearer FMCP_KEY"
}
}
}
}If Cursor shows a form instead of a file, name the server furva, choose the URL type, and add one header row named Authorization with the Bearer value. Or choose Edit JSON and paste the block above.
Add this to .vscode/mcp.json in your workspace. To keep the key out of the file, VS Code can prompt for it through an input variable instead.
{
"servers": {
"furva": {
"type": "http",
"url": "https://mcp.furva.ai/functions/v1/mcp",
"headers": {
"Authorization": "Bearer FMCP_KEY"
}
}
}
}Walkthrough
These are the first four calls an integration makes, with the responses the live endpoint returns. The lab values come from a synthetic test report (a fabricated adult dog panel made for testing, never a real patient). Long text in the responses is shortened with "...".
initialize
Opens the session. Send your key on every request; the server keeps no session state between calls.
POST https://mcp.furva.ai/functions/v1/mcp
Authorization: Bearer FMCP_KEY
Content-Type: application/json
Accept: application/json, text/event-stream
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "my-app", "version": "1.0.0" }
}
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": { "tools": { "listChanged": false } },
"serverInfo": { "name": "furva-mcp", "title": "Furva Lab Interpretation", "version": "1.0.0" },
"instructions": "Furva explains veterinary lab results for dogs and cats in easy to understand language. Educational only. This information is educational and does not replace veterinary advice. Please talk with your veterinarian about your pet's results."
}
}tools/list
API keys see three tools, and the server returns exactly these three. A client may show an extra mcp_auth tool of its own; Furva does not serve it. Descriptions and input schemas are shortened here.
{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{ "name": "interpret_lab_report", "description": "Explains veterinary lab results for a dog or cat...", "inputSchema": { ... } },
{ "name": "get_biomarker_info", "description": "Explains what a lab biomarker measures...", "inputSchema": { ..., "required": ["biomarker"] } },
{ "name": "suggest_retest_timing", "description": "Given biomarker statuses, says which results...", "inputSchema": { ..., "required": ["biomarkers"] } }
]
}
}get_biomarker_info
Included in every plan and never charged. The response also carries a plain-text version in result.content.
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_biomarker_info",
"arguments": { "biomarker": "TRIG", "species": "dog" }
}
}{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [{ "type": "text", "text": "Triglycerides (TRIG), lipids. Measures the amount of triglycerides..." }],
"structuredContent": {
"biomarkers": [
{
"code": "TRIG",
"name": "Triglycerides",
"category": "lipids",
"unit": "mg/dL",
"what_it_measures": "Measures the amount of triglycerides (a type of fat) in the blood...",
"why_it_matters": "High triglyceride levels are usually a sign of an underlying medical condition...",
"reference_context": {
"source": "Reference set range (IDEXX interval)",
"by_species": { "dog": "20 to 150 mg/dL" },
"note": "Your pet's lab may print its own range. The range printed on the report is the one to use."
}
}
],
"disclaimer": "This information is educational and does not replace veterinary advice. Please talk with your veterinarian about your pet's results."
}
}
}interpret_lab_report
One completed interpretation, the billable unit. Four values from the synthetic report: creatinine, BUN, ALT and triglycerides.
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "interpret_lab_report",
"arguments": {
"results": [
{ "biomarker_code": "CREA", "value": 0.5, "unit": "mg/dL", "species": "dog" },
{ "biomarker_code": "BUN", "value": 16, "unit": "mg/dL", "species": "dog" },
{ "biomarker_code": "ALT", "value": 51, "unit": "U/L", "species": "dog" },
{ "biomarker_code": "TRIG", "value": 1262, "unit": "mg/dL", "species": "dog" }
]
}
}
}{
"jsonrpc": "2.0",
"id": 4,
"result": {
"content": [{ "type": "text", "text": "4 results reviewed, 1 outside the reference range..." }],
"structuredContent": {
"source": "provided_values",
"species": "dog",
"results": [
{
"biomarker_code": "CREA",
"biomarker_name": "Creatinine",
"value": 0.5,
"unit": "mg/dL",
"status": "Normal",
"reference_range": "0.5 to 1.5 mg/dL",
"reference_source": "Reference set range (IDEXX interval)",
"explanation": "Creatinine is within the reference range (0.5 to 1.5 mg/dL)..."
},
{ "biomarker_code": "BUN", "status": "Normal", "reference_range": "9 to 31 mg/dL", ... },
{ "biomarker_code": "ALT", "status": "Normal", "reference_range": "18 to 121 U/L", ... },
{
"biomarker_code": "TRIG",
"biomarker_name": "Triglycerides",
"value": 1262,
"unit": "mg/dL",
"status": "High",
"reference_range": "20 to 150 mg/dL",
"reference_source": "Reference set range (IDEXX interval)",
"explanation": "Triglycerides is above the reference range (20 to 150 mg/dL)..."
}
],
"outside_range_count": 1,
"not_interpreted": [],
"questions_for_your_vet": [
"Could medications, hydration, diet or exercise be affecting Triglycerides?",
"What other results should we look at together with Triglycerides?",
"When should we repeat the test?"
],
"disclaimer": "This information is educational and does not replace veterinary advice. Please talk with your veterinarian about your pet's results."
}
}
}After initialize, send the notifications/initialized notification; the server answers it with 202 and no body. Clients that send Accept: text/event-stream receive the same JSON-RPC message as one server-sent event.
Pricing and limits
You pay only for completed interpretations: the first 5 on your account are free, one time, then $3 each. Biomarker lookups and retest timing are always included.
See pricingSupport
Email support@furva.ai. Read our Privacy Policy and Terms of Service.