uvx pulse-mcp server except where called out below. This page covers how they behave,
the full reference for each, and worked end-to-end examples. If you haven’t connected a
client yet, start with Connecting a client.
How the tools behave
A few behaviors are shared across the tools. Understanding them up front explains most of what an agent will do.Document inputs
Documents are referenced by URL: a public or pre-signed link the engine can fetch. The hosted server does not read files from your local disk, so a tool likeextract
takes a file_url, not a file upload.
The local server closes that gap: there, extract also accepts a
file_path. The server process reads the file from disk and uploads it out-of-band, so
the document’s bytes never pass through the model or the chat context. Files up to
50 MB; supported types: pdf, png, jpg, jpeg, bmp, tiff, docx, pptx, xlsx, xlsm, csv,
txt, html.
On the hosted server, host the file somewhere reachable (e.g. an S3 pre-signed URL) and
pass that URL. If you need direct file uploads in your own code, use the
SDKs or REST API instead, which support multipart upload.
Chaining with extraction_id
You extract a document once. extract returns an extraction_id, and the downstream
tools (apply_schema, split_document, extract_tables) take that id so they operate
on the already-parsed document instead of re-fetching and re-parsing it.
Asynchronous jobs and get_job
Extraction, schema, split, and table operations run asynchronously. Each tool submits the
job and inline-polls it for up to ~60 seconds:
- If it finishes in time, the tool returns the completed result directly.
- If it’s still running, the tool returns a stub:
{ "status": "processing", "job_id": "...", "poll_with": "get_job" }.
get_job with that job_id to fetch the status and result.
batch_extract is always asynchronous and returns a batch_job_id to poll the same way.
Large results
To stay under MCP clients’ tool-result size limits, results larger than the inline budget (~350 KB) are offloaded to a download link and returned as a stub:{ "is_url": true, "url": "https://..." }.
The agent cannot fetch that link itself: by design, agents can’t follow tool-output
URLs. To read an offloaded result, paste the URL back into the chat (which makes it
user-provided and fetchable) or open it in your browser. For very large outputs, prefer
the SDK/API, which streams results without this limit.
Page ranges
Wherever a tool acceptspages, use 1-indexed numbers and ranges, comma-separated.
For example, "1-2,5" for pages 1, 2, and 5.
Tool reference
extract
Parse a document into markdown, with optional HTML, figure processing, and chunking.
Provide the document as a file_url, or on the local server, a
file_path.
Provide exactly one of
file_url or file_path.extraction_id and markdown), or a
{ status, job_id } stub to poll with get_job if it’s still running.
For structured JSON, run
extract first, then call apply_schema on the
returned extraction_id. Schema extraction directly on extract is deprecated.apply_schema
Apply a JSON schema to a prior extraction (or split) to get structured output with citations.
Provide exactly one target:
extraction_id: a single extraction, orextraction_ids: combine several extractions, orsplit_id: per-topic schemas (passsplit_schema_config).
Returns
{ schema_id, schema_output: { values, citations } } for single/multi
extraction, or { schema_id, results: { <topic>: { values, citations } } } for split
mode, or a { status, job_id } stub to poll with get_job.
generate_schema
AI-generate or refine a JSON extraction schema. Useful when you want the agent to design a
schema before calling apply_schema.
*Provide a
prompt, a current_schema, or both.{ schema: <JSON schema object> }, ready to pass to apply_schema.
split_document
Split a prior extraction into topic-based page ranges. Run extract first; there is no
file input here.
*Provide either
topics or a split_config_id.{ split_id, split_output: { splits: { <topic>: [page numbers] } } }, or a
{ status, job_id } stub to poll with get_job. Feed the split_id into apply_schema
for per-topic structured extraction.
extract_tables
Pull tables out of a completed extraction.
Returns
{ tables_id, tables_output: { tables: [...] } }, or a { status, job_id }
stub to poll with get_job.
batch_extract
Extract many documents in one asynchronous batch.
*Provide
file_urls, input_s3_prefix, or both.{ batch_job_id, status, total_files }. Poll progress with get_job using the
batch_job_id.
run_pipeline
Run a saved multi-step Pulse pipeline on a document. Pipelines are authored in the
Pulse Platform; obtain the pipeline_id there.
Returns
{ execution_id, status, results } when synchronous (default), or
{ job_id, status } when run_async is true; poll with get_job.
get_job
Poll any previously submitted asynchronous job for its status and result.
Returns the job’s
status and, when complete, its result, or a
{ is_url, url } stub for large results.
Usage patterns
These show the sequence of tool calls an agent makes. In practice you express the goal in natural language and the agent chooses the tools, but seeing the chain makes the behavior predictable.Parse a document
“Extract the text from the Bank Statement sample document”
Parse a local file (local server)
“Extract the text from ~/Contracts/msa.pdf”
file_url instead.
Extract structured data with a schema
“Pull the invoice number, vendor, and total from this invoice: <url>”
generate_schema if you describe the fields in
prose rather than handing it a schema.
Split a multi-section document, then extract per topic
“This filing has a balance sheet and an income statement. Pull the line items from each”
Extract tables
“Get every table from this report as markdown”
Process many documents
“Extract all the PDFs under this S3 prefix and write results back to my bucket”
Handle a long-running job
When a tool returns aprocessing stub, poll it:
Next steps
Connect a client
Configuration for Codex, Claude Desktop, Claude Code, and VS Code.
API Reference
The same operations as REST endpoints and SDK methods.