1. What this is
The Model Context Protocol is the standard way an AI assistant discovers and uses outside tools. This server speaks it, and every CoreNexis API appears through it as a tool your agent can call by name.
The important thing to understand is what this server does not do. It holds no credentials and grants no access of its own. When your agent calls a tool, this server makes the same REST request you could have made yourself, using your API key, and the API being called decides everything: whether the key is valid, whether your account is subscribed, and whether your quota allows it. A key that works over REST works here, and one that does not is refused here in the same way and for the same reason.
Nothing new to learn or pay for. Your existing key, subscriptions, plans and quotas carry over exactly. This is a different way to reach the same APIs, not a separate product with its own billing.
2. Before you start
Two things, both free to begin with.
Get an API key
Create one at dash.corenexis.com/api-keys. A key belongs to your account rather than to one API, so a single key is all you ever need here.
Subscribe to the APIs you want to use
Each API is subscribed to separately, and most have a free tier. Your key will only work for the APIs it is subscribed to, which is the single most common surprise when setting this up: the server connects and lists every tool, then one particular tool refuses the call. That refusal names the API and links you straight to its subscribe page.
Treat the key as a password. Anyone holding it can spend your quota. Put it in your agent's configuration where secrets belong, not in a shared file or a public repository.
3. The endpoint
POSThttps://api.corenexis.com/mcp/server
It uses the Streamable HTTP transport, which is what current MCP clients speak. There is nothing to install and no separate process to run: point your client at the address above and it works.
| Detail | Value |
|---|---|
| Transport | Streamable HTTP |
| Protocol version | 2025-06-18, with 2025-03-26 and 2024-11-05 also accepted |
| Server name | corenexis |
| Authentication | x-api-key header |
| Health check | https://api.corenexis.com/mcp/health, open to everyone |
4. Authentication
Send your API key exactly as you would to any CoreNexis REST endpoint.
x-api-key: your_api_key Some clients can only send a bearer token, and a few cannot set headers at all. Both are accommodated, in this order of preference:
| How | What to send | When to use it |
|---|---|---|
x-api-key Preferred | x-api-key: your_api_key | The normal way. Same header as the REST APIs. |
Authorization Also works | Authorization: Bearer your_api_key | Clients that only offer a bearer token field. |
key Last resort | https://api.corenexis.com/mcp/server?key=your_api_key | Clients with no way to set a header at all. |
The query string is the weakest of the three. A key in a URL tends to end up in browser history, proxy logs and shell history. Use it only when a client leaves you no choice, and give that client a key of its own so it can be withdrawn on its own.
If no key reaches the server, connecting fails immediately with a message saying what to add and where to get it, rather than appearing to work and then failing on the first real call.
5. Connect your agent
Pick the one you use. The address and the key are the same everywhere.
Claude
In Claude Desktop or Claude Code, add the server to your MCP configuration file.
{
"mcpServers": {
"corenexis": {
"type": "http",
"url": "https://api.corenexis.com/mcp/server",
"headers": {
"x-api-key": "your_api_key"
}
}
}
} Restart the app. The CoreNexis tools appear in the tool list, and you can then simply ask for what you want: "turn this Markdown into a PDF", or "read the text out of this image".
n8n
Use the MCP Client node.
| Field | Value |
|---|---|
| Connection type | HTTP Streamable |
| Endpoint URL | https://api.corenexis.com/mcp/server |
| Authentication | Generic credential, Header Auth |
| Header name | x-api-key |
| Header value | Your API key |
Attach the node to an AI Agent node and the tools become available to it. If your version of the node offers no header field, use the query string form of the URL instead.
Any other agent or framework
Anything that speaks MCP over HTTP will work. The shape of the configuration is always the same: an address, and one header.
{
"name": "corenexis",
"transport": "streamable-http",
"url": "https://api.corenexis.com/mcp/server",
"headers": { "x-api-key": "your_api_key" }
} from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
URL = "https://api.corenexis.com/mcp/server"
HEADERS = {"x-api-key": "your_api_key"}
async with streamablehttp_client(URL, headers=HEADERS) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print([t.name for t in tools.tools])
result = await session.call_tool(
"email_validate", {"email": "someone@example.com"}
)
print(result.content[0].text) import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport }
from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://api.corenexis.com/mcp/server"),
{ requestInit: { headers: { "x-api-key": "your_api_key" } } }
);
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
const tools = await client.listTools();
console.log(tools.tools.map(t => t.name));
const out = await client.callTool({
name: "markdown_to_pdf",
arguments: { markdown: "# Invoice\n\nThank you." }
});
console.log(out.content[0].text); 6. Available APIs
All 9+ CoreNexis APIs are reachable through the server. Each one is subscribed to separately; the last column is where to do that.
| API | What it does | Tools | Links |
|---|---|---|---|
Markdown to PDF stable markdown-to-pdf | Turn Markdown into a print-ready PDF or page images. | markdown_to_pdf | API docs Subscribe |
HTML to PDF stable html-to-pdf | Render HTML and CSS to a PDF or a screenshot with a real browser engine. | html_to_pdf | API docs Subscribe |
Image to Text (OCR) stable image-ocr | Read the text out of a photograph or screenshot. | image_to_text | API docs Subscribe |
PDF to Text (OCR) stable pdf-to-text | Extract the text of a PDF, including scanned pages. Runs as a job. | pdf_to_textpdf_to_text_status | API docs Subscribe |
Email Validator stable email-validator | Check whether an email address is real, deliverable and safe to use. | email_validate | API docs Subscribe |
Disposable Email Detector stable disposable-email-validator | Tell a throwaway or temporary address from a real one. | disposable_email_check | API docs Subscribe |
Image Conversion stable image-conversion | Convert an image between formats, and resize or compress it. | image_convert | API docs Subscribe |
Image CDN stable image-cdn | Host an image and get a fast delivery link back. | image_cdn_upload | API docs Subscribe |
QR Code and Barcode available qr-barcode | Generate a QR code, a UPI payment code or a retail barcode. | qr_barcode_generate | API docs Subscribe |
Not sure what you can use? Ask your agent to call corenexis_list_apis for the catalogue, then corenexis_api_details for a specific API. The second one tells you whether your key is subscribed, which plan it is on, and how much quota is left, without spending a monthly call.
7. Tool reference
14 tools in total. Argument names match the REST parameters exactly, so anything written against an API's own documentation works here unchanged.
corenexis_list_apis free List every CoreNexis API reachable through this server, with what each one does, which tools it provides, its documentation link and where to subscribe. Costs nothing and needs no subscription. Call this first if you are not sure which tool to use.
corenexis_account free Check the API key in use and describe the account behind it: whether the key is valid, who owns it, how many APIs are subscribed to, the wallet balance, and anything currently due for payment. Start here when a call has been refused and you need to know whether the key, the subscription or the quota is at fault. Costs nothing and spends no quota.
corenexis_subscriptions free List every API this key is subscribed to, with the plan, the status, what it costs a month, when it renews, how many calls have been used this month against the limit, and whether any payment is due. Use this to answer questions about usage, renewals or bills. Costs nothing.
corenexis_api_details free Everything about one CoreNexis API: what it does, every plan with its price, features and limits, and where this key stands on it. Use this when asked what an API offers, which plan to pick, or what a plan includes. This counts as one request against that API per-minute rate limit, the same as a real call, but never spends a monthly call.
markdown_to_pdf markdown-to-pdf Convert Markdown into a PDF, or into page images. Tables, task lists and syntax highlighted code all render correctly, and documents of a thousand pages are handled. The result comes back as a hosted link, not as file content, so pass the link on rather than trying to read the bytes. Uses one call from your markdown-to-pdf quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
html_to_pdf html-to-pdf Render HTML and CSS to a PDF, or capture it as an image, using a real browser engine. Use this rather than markdown_to_pdf when you already have markup, need web fonts, or need JavaScript to run before the capture. The result comes back as a hosted link. Uses one call from your html-to-pdf quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
image_to_text image-ocr Read the text out of an image: a photograph, a screenshot, a scanned page or a receipt. Returns the text both as plain text and as Markdown with the layout preserved. Give it a public image URL, which is the simplest way, or base64 image data. Uses one call from your image-ocr quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
pdf_to_text pdf-to-text Extract the text of a PDF, including pages that are scanned images. This runs as a background job: the call returns a job_id straight away, and you then call pdf_to_text_status with that id to collect the result. A long document may take a minute or more. Uses one call from your pdf-to-text quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
pdf_to_text_status pdf-to-text Collect the result of a pdf_to_text job, or see how far it has got. Call it with the job_id the submission returned. Checking a job does not spend another call from your quota.
email_validate email-validator Check one email address thoroughly: whether the syntax is valid, the domain exists, it accepts mail, and whether it looks risky or throwaway. Use this before adding an address to a mailing list or accepting a signup. Uses one call from your email-validator quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
disposable_email_check disposable-email-validator Say whether an address belongs to a disposable or temporary mail provider. Lighter and faster than email_validate when that single question is all you need. Uses one call from your disposable-email-validator quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
image_convert image-conversion Convert an image to another format and optionally resize or compress it. Handles the ordinary web formats along with HEIC, TIFF, PSD, AVIF and more. The converted image comes back as a hosted link. Uses one call from your image-conversion quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
image_cdn_upload image-cdn Host an image and get a delivery link back, optionally resizing or compressing it on the way in. Use this when you have an image and need a URL for it; use image_convert instead when the point is the format change. Give it a public URL, or the image itself as base64 when it is a local file. Uses one call from your image-cdn quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
qr_barcode_generate qr-barcode Generate a QR code, a UPI payment QR, or a retail barcode in Code 128, EAN-13 or UPC-A. Returns a hosted image link by default. Uses one call from your qr-barcode quota. If your key is not subscribed to this API the call is refused and tells you where to subscribe; nothing is charged.
Results that are files come back as links. A converted PDF, an image or a generated code is delivered as a hosted URL rather than as file content, because file bytes cannot travel usefully through a tool result. Pass the link on, or download it. Link lifetime depends on your plan.
8. Sending files and images
A tool call carries JSON, not bytes. There is no field anywhere in the Model Context Protocol that a raw file can be poured into, so an agent cannot hand a local file straight to a tool. That is worth knowing before you try, because the failure looks like a missing parameter rather than a limit of the protocol.
There are three ways to get a file in, and which ones a tool accepts depends on the API behind it.
| Tool | Public URL | Base64 | What to do with a local file |
|---|---|---|---|
image_to_text | image_url | image_base64 | Send it as base64. |
pdf_to_text | pdf_url | pdf_base64 | Send it as base64. |
image_convert | image_url | base64 | Send it as base64. The result comes back as a hosted link. |
image_cdn_upload | image_url | image_base64 | Send it as base64. |
qr_barcode_generate | image_url, for type: "image" | not supported | Host the picture first, then pass its URL. |
markdown_to_pdf, html_to_pdf | Neither. The document is text, sent in markdown or html. | Nothing to do: paste the content. | |
1. A public URL, whenever you have one
Always the best option. Nothing large travels through the conversation, and every file-taking tool accepts one.
2. Base64, for a small local file
Encode the bytes and pass them in the base64 field. A data URI prefix is fine and is stripped for you. Two things to keep in mind: base64 is about a third larger than the file, and every byte of it passes through the model's context, so keep this for files of a few megabytes at most.
3. The chain, when a tool wants a URL and you only have bytes
The QR image mode takes a URL and nothing else. The way round it is image_cdn_upload or image_convert: both accept base64 and return a hosted link, which then satisfies anything that wants a URL:
// 1. bytes in, hosted link out
image_cdn_upload { "image_base64": "iVBORw0KGgo..." }
-> { "data": { "url": "https://cdn.corenexis.com/..." } }
// 2. that link now works anywhere a URL is wanted
qr_barcode_generate { "type": "image", "image_url": "https://cdn.corenexis.com/..." } Each call spends one request from that API's quota, so the chain costs two.
4. Straight to REST, for anything large
The APIs themselves accept ordinary multipart uploads, and nothing stops you using them directly for the upload and the MCP tools for everything else. This is the right route for a large PDF or a high resolution photograph.
curl -X POST "https://api.corenexis.com/image-cdn/v3" \
-H "x-api-key: your_api_key" \
-F "image=@/path/to/photo.jpg" Take the url out of the response and give that to any tool.
Results come back the same way. A converted image, a generated PDF or a QR code is returned as a hosted link, never as file content, for exactly the same reason. Pass the link on, or fetch it yourself. How long the link lives depends on your plan.
9. Try it with curl
Useful for confirming a key works before wiring up an agent.
List the tools
curl -X POST "https://api.corenexis.com/mcp/server" \
-H "x-api-key: your_api_key" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' Call a tool
curl -X POST "https://api.corenexis.com/mcp/server" \
-H "x-api-key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"email_validate",
"arguments":{"email":"someone@example.com"}}}' Check what your key can reach
curl -X POST "https://api.corenexis.com/mcp/server" \
-H "x-api-key: your_api_key" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"corenexis_api_details",
"arguments":{"api":"markdown-to-pdf"}}}' 10. Errors and what to do
A failed tool call comes back as a readable sentence rather than a code, so an agent can act on it instead of retrying the same failing call. These are the ones you are likely to meet.
| What you see | Why | Fix |
|---|---|---|
| Authorisation failed: no API key was sent | The client is not sending the header, or is stripping it. | Add x-api-key. If the client cannot set headers, use the query string form. |
| Authorisation failed: the API key was not accepted | The key is wrong, truncated, or has stray whitespace. | Copy it again from the dashboard, whole. |
| That API key has been switched off | The key was disabled in the dashboard. | Re-enable it, or create a new one. |
| Not subscribed: this key does not have a subscription to that API | Keys are per account, subscriptions are per API. This is the most common one. | Subscribe to that API from the dashboard. Nothing was charged for the refused call. |
| The subscription is no longer active | Expired, cancelled, or awaiting a billing action. | Renew it on the API's dashboard page. |
| Rate limit reached | Too many calls in one minute for your plan. | Wait a minute, or move to a larger plan. Retrying at once fails the same way. |
| Monthly quota used up | The plan's monthly allowance is spent. | Wait for the next billing period, or upgrade. |
| That request goes beyond what your plan allows | A per-plan limit, such as file size or output resolution. | Reduce the request, or upgrade. The message names the limit reached. |
| The API could not be reached | A transient problem on our side. | Check the health endpoint and retry shortly. |
A refused call costs nothing. If a call is rejected for authentication, subscription or quota, no monthly call is deducted. Work that fails part way through is not charged either.
11. Status and version
The health endpoint is public and needs no key, precisely because the moment you want it is when your credentials are in doubt. It answers 200 with a small JSON body while the server is serving, and is cheap enough to poll from a monitor.
GEThttps://api.corenexis.com/mcp/health
{
"status": "up",
"service": "CoreNexis MCP server",
"version": "1.0.0",
"endpoint": "https://api.corenexis.com/mcp/server",
"transport": "streamable-http",
"protocol": "2025-06-18",
"apis": 9,
"tools": 14,
"checked_at": "2026-10-01T08:13:12+00:00"
} | Item | Value |
|---|---|
| Current status | Operational |
| Server version | 1.0.0 |
| Last updated | 7 September 2026 |
| APIs exposed | 9 |
| Tools published | 14 |
12. Questions
Does using the MCP server cost more than calling the REST API?
No. A tool call is one REST call, charged the same way against the same plan. The server adds no fee of its own, and the tools that only report on your account (corenexis_list_apis, corenexis_account and corenexis_subscriptions) cost nothing at all.
Do I need a separate key for this?
No. Use the same key you use for REST. If you would rather a particular agent had its own key so you can withdraw it independently, create a second key in the dashboard; both work identically.
Why can I see a tool I am not allowed to call?
The tool list is the same for everyone, because working out what you are subscribed to would mean querying every API on every connect. Instead, a tool you are not subscribed to refuses the call and tells you where to subscribe. Call corenexis_api_details first if you want to know in advance.
Can I send a file to a tool?
Not as raw bytes, and that is a limitation of tool calls generally rather than of this server. Every tool that takes a file accepts a public URL instead, which is the easier path anyway, and most also accept base64 for small inputs. If your file is not online yet, image_cdn_upload will host it and hand you a URL to feed the next tool.
Why does pdf_to_text not return the text straight away?
Reading a scanned PDF can take a while, longer than a tool call should be held open for. The submission returns a job id, and pdf_to_text_status collects the result when it is ready. Checking a job does not spend another call.
Is my data stored here?
This server keeps nothing. It passes your request to the API and the answer back. What each API retains, and for how long, is described in that API's own documentation.
A new API was added to CoreNexis. Do I have to change anything?
No. New APIs appear as new tools automatically; your agent picks them up the next time it lists the tools. Your configuration stays as it is.