DQE One Standalone exposes a
Model Context Protocol (MCP) endpoint so
AI assistants such as Claude can list, create and run your
processes, check runs and upload files — the same operations
as the REST API, driven by conversation.
{DOMAIN} is the host name of your own
DQE One Standalone server — it is self-hosted, so this value
depends on your deployment. {EMAIL} is your
DQE One login and {API_TOKEN} the token
generated in My Account > API Token.
At a glance: JSON-RPC 2.0 over HTTP at
POST https://{DOMAIN}/mcp, protocol version
2024-11-05, 18 tools,
5 prompts, no resources. Plain JSON responses
(no streaming).
The assistant acts as you and only sees
your own objects. Behind the scenes every tool calls the
REST API with your API token, so you
must have generated an API token (My Account > API Token)
even when you connect with OAuth.
Option A — with a header (Claude Code, Claude Desktop config
file)
Build the Basic credential from your email and token:
# Linux / macOS
echo -n "you@example.com:your_api_token" | base64
# Windows PowerShell
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("you@example.com:your_api_token"))
Claude Code (restart the session afterwards;
MCP servers load at startup):
Option B — OAuth (custom connectors, for example in claude.ai)
Enter only the URL https://{DOMAIN}/mcp. The
assistant then discovers everything itself:
The server answers 401 with a WWW-Authenticate
header pointing to
/.well-known/oauth-protected-resource.
The client reads
/.well-known/oauth-authorization-server
and registers itself with /oauth/register.
It opens /oauth/authorize. You must be
signed in to DQE One in the same browser;
check the client name and click Authorize.
The client exchanges the code at /oauth/token
(PKCE S256 required) and receives a Bearer
token valid 1 hour plus a refresh token.
Reachability: for claude.ai the callback
and every tool call come from Anthropic’s side, so your server
must be reachable over HTTPS from the internet.
A server only reachable on your intranet works with Claude
Code or Claude Desktop on a machine that can reach it (Option
A).
Tools (18)
Arguments marked * are required. A tool that
fails still answers HTTP 200 with isError: true
and the message of the underlying REST API.
create_process cannot set
filters, sync, autoMerge,
mergeThreshold, metaToReparent,
allowEmpty, next or
reject_dir_path — so
SFTP processes cannot be created through MCP.
fields has a different shape per kind
(see
Processes),
and for check_duplicate it is
{"<setId>": ["<matching rule label>"]}.
create_credential offers
3 of the 6 REST types. Its
secrets pass through the assistant’s context
(and are written to the server’s debug logs): create
credentials in the web interface instead.
run_process can return
a normal result containing {"status":"error"}
(draft process, no SFTP file, queue failure): read the
body.
No tool reads a RuleSet’s matching labels, cancels a
run, downloads results, merges or synchronises. Review
results in the web interface.
Prompts (5)
prompts/list returns five parameterless prompts.
prompts/get returns
{description, messages, instructions} (instructions
is a non-standard extra). There are no MCP resources.
Prompt
Purpose
create_process_dedup
Guided creation of a deduplication process (it
still asks for filters, reparenting and sync,
which create_process cannot set).
The assistant calls upload_file and gets
https://{DOMAIN}/upload/<token>/,
valid for 1 hour.
You open the link in a browser and drop
a .csv, .xlsx or .xls
file (unique headers, no spaces, one file per link).
The assistant polls get_upload_status until
done, which gives the file_id.
create_process with "source":"csv"
and "file": <file_id>.
The link is the credential. The upload page
needs no login: anyone holding the URL can upload into your
account for one hour, and the link is shown in the chat.
The page says “max 50 MB” but
no limit is enforced on the server.
Worked example — deduplicate a CSV
list_rulesets → pick one with
source: "csv"; note its id
(7) and setId (RS_ABC).
upload_file, give the URL to the user, then
get_upload_status until done
(file_id 12).
get_file {"id":12} → check that the primary
key is in headers.
Find the RuleSet’s matching labels.
No MCP tool returns them: ask the user,
or read matching.Labels[].value with
getRuleset in the REST API.
list_runs {"runId":101} until status
is Finished or Failed.
Review the duplicates in the DQE One web interface.
Limitations and security notes
These describe the current behaviour of the product.
No scopes, no read-only mode: a connected
assistant can do everything your account can. Only connect
assistants you trust.
OAuth client registration is open (no
authentication): any client can register and choose the
name shown on the consent screen. Check the name and
the redirect before you click Authorize. You must still
be signed in and consent.
Refresh tokens never expire and are
not rotated; tokens are stored in clear in the database;
there is no revocation screen. Administrators can revoke
a token in the database.
The server writes request bodies and tool arguments —
including credential secrets — to its debug output; whether
this reaches logs depends on your deployment.
No rate limiting; CORS is open to any origin; the legacy
SSE transport keeps sessions in memory and works with
a single worker only.
JSON-RPC endpoint - DQE One Standalone MCP
The single entry point: send one JSON-RPC message, get one
JSON object back.
Send a JSON-RPC 2.0 body. initialize and
ping need no authentication; everything else
needs Basic or Bearer.
Calling a tool:{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list_processes","arguments":{}}}.
The result is
{"content":[{"type":"text","text":"<JSON as a string>"}]};
on failure isError is true but
the HTTP status stays 200.
Error codes:-32700 parse error
(HTTP 400); -32601 unknown method
or unknown tool; -32602 unknown prompt.
Unauthorized is an HTTP 401 with a WWW-Authenticate
header that starts OAuth discovery. There is no batching
and resources/* is not implemented.
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new
AuthenticationHeaderValue(
"Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("{EMAIL}:{API_TOKEN}")));
using var request = new HttpRequestMessage(HttpMethod.Post,
"https://{DOMAIN}/mcp");
request.Content = new StringContent("{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}",
Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode + " "
+ await response.Content.ReadAsStringAsync());
Unauthorized. Carries a WWW-Authenticate: Bearer
resource_metadata=... header that triggers OAuth
discovery.
Test the API
Click the button below to test this endpoint live in your
browser.
Heads-up: this console sends a
real request to your own server from your
browser, with your real API token. tools/call
can start runs or delete data.
Open console
Server info - DQE One Standalone MCP
Returns basic server information without authentication.
With Accept: text/event-stream it opens the
legacy SSE transport instead (Basic auth only; single worker).
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get,
"https://{DOMAIN}/mcp");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode + " "
+ await response.Content.ReadAsStringAsync());
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get,
"https://{DOMAIN}/.well-known/oauth-protected-resource");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode + " "
+ await response.Content.ReadAsStringAsync());
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get,
"https://{DOMAIN}/.well-known/oauth-authorization-server");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode + " "
+ await response.Content.ReadAsStringAsync());
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post,
"https://{DOMAIN}/oauth/register");
request.Content = new StringContent("{\"redirect_uris\":[\"https://client.example.com/callback\"],\"client_name\":\"My
connector\"}", Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode + " "
+ await response.Content.ReadAsStringAsync());
The page where you approve a connector. It is opened in a
browser, not called from code. You must
be signed in to DQE One in the same browser; PKCE S256
is mandatory; the code lasts 5 minutes.
Exchanges an authorization code for tokens, or refreshes
an access token. The access token lasts 1 hour;
refresh tokens do not expire and are not rotated.
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post,
"https://{DOMAIN}/upload/{token}/");
var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(File.ReadAllBytes("contacts.csv")),
"file", "contacts.csv");
request.Content = form;
var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode + " "
+ await response.Content.ReadAsStringAsync());