
Upload a file to Adobe PDF Services for processing. Returns an asset_id to use with PDF operations. File content must be base64-encoded. Supported types: PDF, Word, Excel, PPT, HTML, images.
Download a processed file from Adobe PDF Services. Use the downloadUri from a completed job status response. Returns base64-encoded file content. Set returndownloadurl=true for a short-lived download URL instead, which handles larger files.
Convert a Word, Excel, PowerPoint, HTML, or image file to PDF. Upload the source file first with uploadasset, then pass its assetid. Returns a statusurl to poll with getjob_status.
Convert a PDF to Word, Excel, PowerPoint, RTF, PNG, or JPEG. Upload the PDF first with uploadasset, then pass its assetid. Returns a statusurl to poll with getjob_status.
Extract text, tables, and figures from a PDF using AI. Upload the PDF first with uploadasset. Results include structured JSON with text and table data. Returns a statusurl to poll with getjobstatus.
Get metadata and properties of a PDF (page count, dimensions, etc.). Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Generate a PDF or Word document from a template and JSON data. Upload a Word template first with uploadasset, then pass JSON data to merge. Returns a statusurl to poll with getjobstatus.
Auto-tag a PDF for accessibility compliance. Adds structure tags for headings, paragraphs, lists, tables, etc. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Add a searchable text layer to a scanned PDF using OCR. Upload the scanned PDF first with uploadasset. Supports multiple languages. Returns a statusurl to poll with getjobstatus.
Add a watermark to a PDF using another PDF or image as the watermark. Upload both the target PDF and watermark file with uploadasset first. Returns a statusurl to poll with getjobstatus.
Poll the status of an Adobe PDF Services operation. Use the status_url returned by any operation tool. Status is 'in progress', 'done', or 'failed'. When done, the response includes asset download info.
Merge multiple PDFs into a new PDF; the input PDFs are unchanged. Upload each PDF with uploadasset first. Pass asset objects with 'assetID' and optional 'pageRanges'. Returns a statusurl to poll with getjobstatus.
Split a PDF into multiple files by page count, page ranges, or file count. Creates new output PDFs; the input PDF is unchanged. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Reduce the file size of a PDF. Compression levels: LOW, MEDIUM, HIGH. Creates a new output PDF; the input PDF is unchanged. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Optimize a PDF for fast web viewing (linearization). Creates a new output PDF; the input PDF is unchanged. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Insert pages from one PDF into another at a specific position. Upload both PDFs with uploadasset first. Returns a statusurl to poll with getjobstatus.
Replace pages in a PDF with pages from another PDF. Upload both PDFs with uploadasset first. Returns a statusurl to poll with getjobstatus.
Delete specific pages from a PDF. Upload the PDF first with uploadasset. Page ranges use 1-indexed start and end. Returns a statusurl to poll with getjobstatus.
Rotate pages in a PDF by 90, 180, or 270 degrees. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Reorder pages in a PDF. Specify the new page order with asset IDs and ranges. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Add password protection and encryption to a PDF. Set userpassword (to open) and/or ownerpassword (to change permissions). Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Remove password protection from a PDF. Provide the password used to protect the file. Upload the PDF first with uploadasset. Returns a statusurl to poll with getjobstatus.
Apply an electronic seal (e-seal) to a PDF using a digital certificate. Upload the PDF first with uploadasset. Requires seal certificate credentials (URL, password, type). Returns a statusurl to poll with getjobstatus.
Validate Adobe PDF Services credentials by attempting a token exchange. Returns success if the clientid and clientsecret are valid.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now