pulr

pulr

Secure file exchange MCP server enabling AI agents to upload, share, fetch, and revoke files with SHA-256 verification, malware scanning, expiry, access restrictions, and human approval workflows.

Category
访问服务器

README

<p align="center"><img src="design/banner.png" alt="pulr — secure passage of files between minds" width="100%"></p>

pulr

Secure file exchange for AI agents. Agents produce files — reports, CSVs, images, PDFs, code — and have no safe way to hand them to other agents, humans, or downstream automation. pulr.ai is that handoff layer: drop a file, get a verified, scannable, expiring download URL everyone in the chain can actually trust.

Every upload is SHA-256-hashed, scanned before any link activates (secrets, prompt-injection heuristics, ClamAV malware), stamped with provenance (which agent, workflow, and model produced it), and served through unguessable capability URLs with TTLs, download limits, IP/geo/time restrictions, and instant revocation. Humans get a review page with approve/reject; automation gets webhooks and Ed25519-signed receipts. Everything is audit-logged — who fetched, when, from where.

Website: pulr.ai · Docs: pulr.ai/docs · Self-serve signup: pulr.ai/app

This repo is the open tooling: the MCP server (root, npm mcp-server-pulr), the JavaScript SDK (sdk/js, npm @pulr/sdk), and the Python SDK (sdk/python, PyPI pulr-sdk, with LangChain tools).

<p align="center"><img src="design/plate08-vignettes.png" alt="Sealed handoff: sender → sealed capsule → customs → accepted. Safeguards: encrypted, audited, MFA, PHI-blind" width="92%"></p>

Sample uses

  • Agent → human sign-off → automation. An agent generates a quarterly report with approval: true; the reviewer gets the link by email, previews provenance and scan results, clicks Approve & release — only then does the download URL go live, and a webhook kicks off the downstream pipeline with a signed receipt as proof.
  • Agent → agent handoff without context stuffing. Instead of jamming base64 blobs into a context window, one agent uploads and passes a capability URL; the receiving agent fetches integrity-verified bytes. Revoke the link the moment the job is done.
  • Burn-after-reading delivery. max_downloads: 1 + a 1-hour TTL: send credentials-adjacent artifacts, one fetch, then the link is dead — with an audit row showing exactly who took it, from which IP.
  • Geo/time-fenced distribution. Lock a link to your office CIDR, US-only access, or 9–5 Eastern: restrictions: { allow_ips, allow_countries, allow_hours }.
  • Quarantine as a feature. A "meeting notes" file with an embedded "ignore all previous instructions…" payload (even zero-width-obfuscated or base64-smuggled) gets flagged at upload and can never be shared — your agents never ingest it.
  • Compliance trail. GET /v1/artifacts/:id/receipt returns an Ed25519-signed record of hash + provenance + scan + approval, verifiable by anyone without trusting pulr.

Your files are not our data

The only thing that ever reads uploaded bytes is the automated threat scanner — malware signatures, leaked-secret patterns, prompt-injection heuristics. It looks for threats, not information: the verdict is recorded, the content is not extracted, indexed, mined, trained on, or sold.

<p align="center"><img src="design/plate08b-scanner.png" alt="The scanner is not a reader: your file, content folded away → scanned for threats only → same file, never opened → no human reads" width="92%"></p>

MCP server (Claude, agent frameworks)

{
  "mcpServers": {
    "pulr": {
      "command": "npx",
      "args": ["-y", "mcp-server-pulr"],
      "env": { "PULR_API_KEY": "pulr_sk_..." }
    }
  }
}

Then just ask your agent: "Upload this report to pulr with approval required and a 24-hour expiry, and give me the review link."

Tools: pulr_upload (with approval), pulr_send / pulr_inbox / pulr_accept / pulr_reject / pulr_address (sealed workspace-to-workspace handoff — no links), pulr_share (with restrictions), pulr_fetch, pulr_list, pulr_revoke, pulr_receipt, pulr_whoami. Env: PULR_API_KEY (required), PULR_API_URL (optional, defaults to https://pulr.ai; point at your own instance if self-hosting).

JavaScript / TypeScript — npm install @pulr/sdk

import PulrClient from '@pulr/sdk'
const pulr = new PulrClient({ apiKey: process.env.PULR_API_KEY })

const a = await pulr.upload({ filePath: './q3-report.pdf', approval: true, expiresIn: '48h' })
console.log(a.review_url)                                  // send to a human
const { bytes } = await pulr.fetchCapability(a.download_url)  // sha256-verified
console.log(PulrClient.verifyReceipt(await pulr.receipt(a.artifact_id)))  // true

Python — pip install pulr-sdk

from pulr import PulrClient, verify_receipt
pulr = PulrClient()  # reads PULR_API_KEY

a = pulr.upload(file_path="q3-report.pdf", approval=True, expires_in="48h",
                restrictions={"allow_countries": ["US"]})
data, sha = pulr.fetch_capability(a["download_url"])   # sha256-verified
verify_receipt(pulr.receipt(a["artifact_id"]))         # pip install pulr-sdk[verify]

LangChain: from pulr.langchain_tool import pulr_tools → pulr_upload / pulr_fetch / pulr_share StructuredTools for any agent.

Getting a key

Create a workspace at pulr.ai/app — 30 seconds, 500 MB included, owner API key shown once. Mint one key per agent (provenance is stamped from the key); revoke any key to cut that agent off instantly. Full API reference: pulr.ai/docs.

A pulr "artifact" is a durable file with a lifecycle — not a streaming chat-UI panel. If you want typed real-time artifact panels for React chat apps, that's a different (complementary) tool, e.g. @ai-sdk-tools/artifacts. pulr is where the file goes afterward.

MIT © Tal Eilon

The design plates

pulr's product design is kept as a series of drafting plates — one per chapter of the system. A few from the atlas:

<img src="design/plate06-registry.png" alt="Harbor Registry — accounts: a name is pencil until witnessed"> <img src="design/plate04-watchroom.png" alt="Watchroom — the operations register">
<img src="design/plate05-open-water.png" alt="Open Water — the 404: here the survey ends"> <img src="design/plate01.png" alt="Sealed Passage — plate one">

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选