NitroStack Calculator MCP Server
This server provides basic arithmetic and temperature conversion capabilities.
Arithmetic calculations: Perform addition, subtraction, multiplication, and division on two numbers using the
calculatetool.Temperature conversion: Convert temperatures between Celsius and Fahrenheit using the
convert_temperaturetool, supporting both direct numeric input and file-based input (including Base64 encoded file content).
Provides tools for searching PubMed literature, retrieving article details including citation, DOI, MeSH terms, and parsed XML abstracts, and summarizing evidence for medical research.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@NitroStack Calculator MCP ServerWhat is 17% of 250?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Vitalis — Clinical Intelligence MCP Server
Vitalis is an MCP server that exposes authenticated tools, resources, prompts, and widgets for clinical information workflows.
Responsible use: Vitalis provides clinical decision-support information for research and demonstration. It is not a medical device and must not replace a licensed clinician, emergency services, or local clinical policy.
Quick test queries
After connecting Vitalis to NitroStudio, MCP Inspector, Claude Desktop, or another MCP client, paste these prompts one at a time. Use the read-only API key for the first group. Use API_KEY_CLINICIAN for medication reconciliation and referral drafting.
Triage and diagnostics
Assess these example symptoms for a 35-year-old female: headache and sore throat for 24 hours, severity 3/10. Return the urgency tier, red flags, and general care timeframe.
Check whether these example symptoms match emergency red flags: slurred speech and facial drooping.
Explain what an HbA1c test measures and interpret an example value of 7.2% for educational purposes.
Map the symptom "cough" to candidate ICD-10-CM codes for documentation support. Do not diagnose the patient.Drug safety
Search RxNorm for metformin and show the matching drug names and RxCUI values.
Get FDA label information for warfarin, focusing on boxed warnings and drug interactions.
Check the available evidence for interactions between warfarin and aspirin, including the methodology caveat.
Find recent FDA adverse-event reports for ibuprofen, limited to five results.Research and trials
Search PubMed for mRNA-based therapeutics and return up to five relevant articles with citations.
Find recruiting ClinicalTrials.gov studies for type 2 diabetes and return up to five trials.
Search PubMed for peer-reviewed clinical practice guidelines for hypertension.Synthetic FHIR and care coordination
Search the synthetic FHIR server for up to five patients named Alex. Clearly label the returned records as synthetic.
Using a patient ID returned by the previous query, show that synthetic patient's conditions, medications, observations, and encounters.
Prepare an appointment checklist for a follow-up visit for hypertension.
Using a returned synthetic patient ID, generate an SBAR handoff and clearly label it as a draft based on synthetic data.
Reconcile these example medication lists: EHR list [metformin 500 mg, warfarin 5 mg] and patient-reported list [metformin 500 mg, warfarin 5 mg, ibuprofen 400 mg]. Show continued, added, removed, and possible duplicate-risk medications.
Using a returned synthetic patient ID, draft a routine endocrinology referral for example reason: "HbA1c remains elevated despite current therapy." Mark it as requiring clinician review.The patient-summary, handoff, and referral queries require a patient ID returned by the FHIR search. Do not enter real patient information. care_reconcile_medications and care_draft_referral require the clinician key and always require clinician review.
Related MCP server: NitroStack Calculator MCP Server
1. Endpoint status
No public endpoint is claimed by this repository until it has passed the authenticated verification checklist in docs/deployment.md. After deployment, publish the value as:
https://<your-deployment-domain>/mcpFor local operation, configure locally generated keys in .env and use the read-only key for normal calls. Never copy the placeholder values from .env.example into a public deployment.
2. Tools and public API
The runtime registers 32 tools with the following controller-prefixed names.
Triage (triage:read)
triage_assess_symptomstriage_check_red_flagstriage_get_care_options
Drugs (drugs:read)
drugs_searchdrugs_get_label_infodrugs_check_interactionsdrugs_get_adverse_eventsdrugs_get_recalls
Diagnostics (dx:read)
diagnostics_lookup_conditiondiagnostics_interpret_lab_valuediagnostics_explain_lab_testdiagnostics_symptom_to_codes
Research (research:read)
research_search_pubmedresearch_get_articleresearch_search_trialsresearch_get_trial_detailsresearch_summarize_evidence
FHIR (fhir:read)
fhir_search_patientsfhir_get_patientfhir_get_conditionsfhir_get_medicationsfhir_get_observationsfhir_get_encountersfhir_get_patient_summary
Care (care:read / care:write)
care_generate_handoff(care:read)care_reconcile_medications(care:write)care_draft_referral(care:write)care_find_guidelines(care:read)care_appointment_prep(care:read)
Clearly labeled stretch tools
diagnostics_lookup_icd11fhir_get_allergiesfhir_get_immunizations
Resources
vitalis://safety-policy— public safety policyvitalis://data-sources— public upstream registryvitalis://audit/recent— admin-only latest 50 audit entriesvitalis://metrics— admin-only telemetryhealth://checks— framework health-check resourcewidget://examples— framework-loaded widget examples
3. Example MCP calls
The HTTP MCP endpoint is /mcp. Headers are shown for API-key authentication; MCP clients may also pass _meta.x-api-key where supported.
{
"method": "tools/call",
"params": {
"name": "triage_assess_symptoms",
"arguments": {
"symptoms": ["chest pain", "shortness of breath"],
"age": 55,
"sex": "male"
},
"_meta": { "x-api-key": "<read-write-key>" }
}
}{
"method": "tools/call",
"params": {
"name": "drugs_check_interactions",
"arguments": {
"drugs": ["warfarin", "aspirin"]
},
"_meta": { "x-api-key": "<read-only-key>" }
}
}Successful clinical results include _safety and _meta.durationMs. FHIR and care results identify synthetic data. Errors use stable codes such as AUTH_DENIED, SCOPE_DENIED, PATIENT_NOT_FOUND, and UPSTREAM_UNAVAILABLE.
4. Architecture
MCP client / NitroStudio / Claude Desktop
│
▼
NitroStack MCP transport (/mcp)
│
Emergency guard → API/JWT auth → scope guard
│
trim pipe → tool handler → safety
│
audit event → timing/metrics → client
│
Triage · Drugs · Diagnostics · Research · FHIR · Care
│
RxNorm · RxClass · OpenFDA · PubMed · Trials · FHIR · Clinical TablesThe six widget routes are connected to their tools with @Widget and are bundled by NitroStack from src/widgets/.
5. Authentication, scopes, and rate limits
Configure credentials through environment variables only:
API_KEY_CLINICIAN=<random-key-with-read-write-care-scopes>
API_KEY_READONLY=<random-key-with-read-scopes>
API_KEY_ADMIN=<random-key-with-admin-scope>
VITALIS_ALLOW_ANONYMOUS_DEMO=false
# Optional HS256 JWT support:
# JWT_SECRET=<random-secret-at-least-16-bytes>API_KEY_READONLY: triage, drugs, diagnostics, research, and FHIR read scopes.API_KEY_CLINICIAN: read scopes pluscare:readandcare:write.API_KEY_ADMIN: explicit admin identity, wildcard tool access, andadmin:audit.Anonymous mode is disabled by default, must be explicitly enabled, and never receives care-write or admin scopes.
Unknown tools fail closed.
vitalis://audit/recentandvitalis://metricsrequire the configured admin identity.If
JWT_SECRETis set, bearer JWTs are validated as HS256 tokens with strict claims; JWTs do not inherit the API-key admin wildcard.
Default tool limits are configured per module: research and heavy drug operations are limited to 10 requests/minute, FHIR to 20/minute, local triage/diagnostics to 120/minute, and care operations according to their tool cost. These limits are per authenticated subject.
6. Clinical safety design
Every clinical tool uses the shared gateway. The safety layer:
scans nested input for emergency terms using escaped, case-insensitive word-boundary matching;
never blocks a request merely because emergency terms are present;
rewrites banned overreach such as “you have”/“diagnosis confirmed” and prescriptive dosing language;
adds a disclaimer, urgency tier, and red-flag metadata;
prepends emergency guidance when a red flag is detected;
marks FHIR and care output as synthetic data.
The embedded triage ruleset contains 30 validated rules. Missing or malformed safety data refuses startup. VITALIS_SAFETY_LAYER=off is test-only; outside NODE_ENV=test it is ignored and logged loudly.
7. Data sources and terms
Source | Use | Policy |
NLM RxNorm/RxClass | Drug names, RxCUI, classes | Public API; concurrency capped |
OpenFDA | Labels, FAERS, recalls | FDA terms and reporting-bias caveats apply |
NCBI PubMed | Search, citations, XML abstracts | NCBI |
ClinicalTrials.gov v2 | Trial search/details | Public API; bounded requests |
HAPI FHIR R4 / SMART fallback | Synthetic FHIR records | Synthetic/Synthea data only |
NLM Clinical Tables | ICD-10-CM lookup | Public documentation-support service |
WHO ICD-11 (optional) | Optional classification lookup | Requires configured OAuth credentials; embedded fallback is labeled reference data |
Respect each provider’s current terms, rate limits, attribution requirements, and availability. Upstream content is not a clinical recommendation.
8. Local setup
Prerequisites
Node.js 18 or newer
npm
git clone https://github.com/anshux1/vitalis-mcp.git
cd vitalis-mcp
npm ci
npm --prefix src/widgets ci
cp .env.example .env
# Replace every credential placeholder with local valuesDevelopment defaults to stdio. HTTP mode can be selected explicitly:
NODE_ENV=development
MCP_TRANSPORT_TYPE=http
HOST=127.0.0.1
PORT=3000Commands:
npm run dev # NitroStack development server
npm run typecheck # TypeScript check
npm test # Unit + integration tests
npm run test:coverage # Coverage gate and HTML/JSON reports
npm run widget:build # Standalone Next.js widget build
npm run build # Server + widget production bundle
npm run verify # All default non-live gatesLive upstream tests are opt-in:
npm run test:live # Requires network; sets LIVE_API_TESTS=true
npm run fixtures:record # Explicitly capture sanitized public fixtures9. Deployment
The primary documented target is Railway. See docs/deployment.md for build/start commands, environment configuration, MCP endpoint setup, verification, audit storage, rollback, and the local stdio fallback.
At minimum, production must set NODE_ENV=production, MCP_TRANSPORT_TYPE=http, HOST=0.0.0.0, PORT from the platform, CONTACT_EMAIL, NCBI_EMAIL, and at least one API key or JWT secret. Do not put secrets in Git or .env.example.
10. Limitations and responsible use
Vitalis does not diagnose, prescribe, or replace a clinician.
Emergency guidance is generic; users should contact local emergency services.
FHIR data is synthetic and must never be interpreted as real PHI.
FDA interaction detection is evidence cross-scanning, not a complete interaction database.
FAERS counts are voluntary reports, not incidence rates or proof of causation.
Public upstreams can be incomplete, rate-limited, or unavailable; partial/fallback status is surfaced.
JWT support is optional HS256 infrastructure, not a hosted identity provider.
Available Tools
2 toolscalculateC
Perform basic arithmetic calculations
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | First number | |
| b | Yes | Second number | |
| operation | Yes | The operation to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description bears full responsibility. It states it performs calculations but omits potential side effects like division-by-zero errors or whether the tool is read-only, leaving behavior ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using only four words to convey the entire purpose. There is no redundancy or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks essential context such as the return format, error handling, or precision of results. Given no output schema and no annotations, the tool is incomplete for an agent to fully understand behavior without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions cover all parameters, giving a baseline of 3. The tool description itself adds no extra meaning beyond the schema, but the schema already defines 'a', 'b', and 'operation' sufficiently for basic arithmetic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs basic arithmetic calculations, which is a specific action. It distinguishes itself from sibling tools like convert_temperature by being generic, though it lacks detail on exact operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as convert_temperature. There is no mention of typical use cases or conditions for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_temperatureC
Convert temperature units based on file content or direct input. Supports Celsius (C) and Fahrenheit (F).
| Name | Required | Description | Default |
|---|---|---|---|
| value | No | Temperature value to convert | |
| to_unit | No | Unit to convert to (C or F) | |
| file_name | Yes | Name of the uploaded file | |
| file_type | Yes | MIME type of the uploaded file | |
| from_unit | No | Unit to convert from (C or F) | |
| file_content | Yes | Base64 encoded file content. Will be injected by system. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the tool works 'based on file content or direct input', but the schema requires file_name, file_type, and file_content for all invocations, making direct input impossible without dummy file data. This contradiction is misleading and fails to disclose the actual required behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence that gets to the point quickly. It could be slightly more explicit about the file/direct input behavior, but overall it is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks necessary context about the relationship between the file parameters and the temperature conversion parameters, especially given the required fields. There is also no explanation of output format or behavior when both file and direct input are provided, leaving the tool's usage incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have descriptions, so schema coverage is complete, meeting the baseline. However, the descriptions are minimal, and the file-related parameters are confusing because they are marked required even for 'direct input' and provide no clarity on their purpose or interaction with the value/from_unit/to_unit parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool converts temperature units between Celsius and Fahrenheit, identifying the specific verb and resource. However, the mention of 'file content or direct input' introduces some ambiguity about the exact mode of operation, slightly detracting from full clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus the sibling tools like 'calculate' or 'upload-and-analyze'. The description only explains what the tool does, not the scenarios in which it should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.0.0- First observed
calculate - First observed
convert_temperature
TDQS
Scored across 2 tools
Calculate and convert_temperature have clearly distinct purposes: one performs arithmetic, the other converts between temperature units. There is no overlap or ambiguity between the two tools.
Both tool names follow a consistent verb-based pattern, with 'calculate' being a bare verb and 'convert_temperature' using verb_noun. The naming is coherent and predictable.
With only 2 tools, the server feels thin for a calculator-focused MCP. While the tools are focused, the count is borderline for what could be a richer domain.
The tool set covers arithmetic and temperature conversion but lacks common calculator features such as scientific functions or other unit conversions. This leaves notable gaps for a general-purpose calculator, though it may suffice for basic needs.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A simple Typescript MCP server built using the official MCP Typescript SDK and smithery/cli. This…
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Nifra docs, runnable examples, and API types as an MCP server for any AI assistant.
Related MCP Servers
- FlicenseBqualityCmaintenanceMinimal calculator-focused MCP server with tools, resources, and prompts using TypeScript and Zod validation.2-
- FlicenseBqualityCmaintenanceA minimal MCP server template for learning NitroStack fundamentals, featuring a calculator module with tools, resources, and prompts.6-
- FlicenseCqualityCmaintenanceA minimal MCP server template for learning NitroStack fundamentals, featuring a calculator module with tools, resources, and prompts.9-
- AlicenseNot gradedqualityCmaintenanceThis template enables learning NitroStack fundamentals with a calculator-focused MCP server that supports tools, resources, and prompts. It includes TypeScript and Zod validation for building MCP servers.1521MIT