mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-08 11:13:44 +02:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Research agents need current web information. > - The Apps catalog connects agents to remote MCP tools through the normal access rules. > - Telem.AI supplies web search and page reading through one API key. > - This PR adds its catalog entry, optional search settings, artwork, and setup guide. > - The connection keeps an operator's saved header policy when they reconnect. ## Linked Issues or Issue Description Refs #15302. Related catalog work: #13881. This PR continues #15302 by Yifei Ai (@aiwen324). Thank you for the connector and its review fixes. All seven original commits are preserved. GitHub denied the attempt to push to the contributor's fork, so this branch retains the repair commit and merges current master. Master now includes the same test fix. For a squash merge, keep the original author in the final commit message: ```text Co-Authored-By: Yifei Ai <aiwen324@users.noreply.github.com> Co-Authored-By: Paperclip <noreply@paperclip.ing> ``` A search found no separate public Telem issue or competing Telem PR. The existing Apps path matches the roadmap. **Agent or provider** Telem.AI provides web search and page reading through a hosted MCP server. **Why this adapter is useful** Agents can use multiple search providers through one governed connection. Operators can set the search tier, auto routing, and provider lists. **How the agent is invoked** The remote MCP server uses Streamable HTTP at `https://mcp.telem.ai/mcp`. The API key uses an `Authorization: Bearer` header. See the [official MCP guide](https://docs.telem.ai/integrations/mcp/). ## What Changed - Add the Telem.AI definition, research entry, permission review, and generated registry entry. - Add four optional settings. Unset settings send no request header. - Add official light and dark artwork, source records, and a setup guide. - Forward company, issue, agent, run, project, and correlation IDs by default. Preserve a saved policy, including disabled forwarding, on reconnect. - Add catalog and connection tests. ## Verification Current head: `b4164477fb1b312a504789bf17b51c963244c0fd`. Merged master: `228f0e2807c5b59d2aa129cf2d80b9777ebabf07`. - Resolved five shared catalog conflicts after the Superagent connection merged. - Keep both providers in the research ledger, generated registry, generator, branding manifest, and connection guide index. - Correct the combined catalog totals: 52 self-serve candidates, 55 research entries, and 68 Apps entries. - The published Git tree exactly matches the tested local resolution. - Catalog and Apps UI suites: **295 tests pass** after the catalog count fixes. - Connection service suite: **387 tests pass** in the full run. Its only failure was the old catalog count. That test passes on a focused rerun after the fix. This gives **388 passing service tests** across the two runs. - Total focused coverage: **683 passing tests**. The first runs exposed four fixed-count assertions that needed the combined totals. - Shared package build and plugin SDK compile pass. Token gates and whitespace checks pass. - Generation with `--definitions-only` reproduces the Telem definition and registry. The unrelated AgentMail and Linear drift remains excluded. - Local UI typecheck ended with exit 137 at the container memory limit. Full local typecheck, test, and build are not claimed. Earlier runs also recorded missing Cargo and Node development headers. - GitHub reports a clean merge state against master `228f0e280`. - All 54 checks are complete: **52 passed and two Storybook checks skipped**. No check failed or remains pending. - [CI](https://github.com/paperclipai/paperclip/actions/runs/37545412406) passes on this head. This includes typecheck, build, tests, browser shards, Runner checks, and Canary Dry Run. - [Greptile](https://github.com/paperclipai/paperclip/pull/15379#issuecomment-6024519537) is **5/5 on this head**. There are no review threads, open P2s, recommendations, or follow-ups. - [Superagent](https://github.com/paperclipai/paperclip/runs/112548142930) passes. - Final recovery checks confirm all seven original commits and current master remain in history. Token gates and whitespace checks pass. - The final recovery run makes no source change. It verifies the published repair and retains the local check limits below. - [Commitperclip](https://github.com/paperclipai/paperclip/actions/runs/37545407943) passes with no failures. Its only informational note asks the merger to keep the author trailer above. - All seven original contribution commits remain in history. The diff against master contains the same 14 Telem files. It adds no dependency, lockfile, schema, or workflow change. - The managed GitHub CLI capability was missing in this run. The installed GitHub connection applied the base files, merged master, then restored the tested combined catalog. No history was rewritten. The previous head `2d32a0094` passed all remote gates and had Greptile 5/5. Those results do not verify this new head. The original PR reports live setup, discovery, settings headers, gateway calls, and context-header forwarding. This repair does not repeat those account-bound checks. The permission record still marks maintainer live qualification as outstanding. ## Risks - Telem.AI receives the six context IDs by default. The saved header policy controls forwarding. Search use is billed to the account that owns the key. - All agents on a connection share its search settings. - The merge uses master's route-test setup unchanged. The company-boundary assertions remain intact. - No schema, dependency, or workflow change is included. - Live provider evidence is attributed to the original contributor. Maintainer live qualification remains outside this CI repair. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - Original contribution: Anthropic Claude Opus 5.5 (`claude-opus-5-5`), 1M-token context, through Claude Code with shell, editing, and test tools, as disclosed in #15302. - CI repair and review: OpenAI `gpt-6-astra`, through Codex with reasoning, shell, editing, and GitHub tools. The runtime does not expose the context-window size. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Yifei Ai <aiwen324@gmail.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: devinfoley <139239+devinfoley@users.noreply.github.com> Co-authored-by: Paperclip <noreply@paperclip.ing>
209 lines
11 KiB
Markdown
209 lines
11 KiB
Markdown
# Apps, Connections, and Integrations
|
|
|
|
Audience: internal engineers and product contributors working on integrations.
|
|
|
|
Start here when adding a provider:
|
|
[Connection authoring runbook](./CONNECTOR-PLAYBOOK.md). It is the canonical
|
|
agent tutorial from provider research and protocol classification through
|
|
manifest generation, branding, secrets, deterministic tests, real-account
|
|
proof, and PR submission.
|
|
|
|
Runtime authentication: [AI Connections](./AI-CONNECTIONS.md).
|
|
|
|
Long-term memory: [Experimental memory connectors](./MEMORY.md).
|
|
|
|
Provider notes: [Google Workspace](./GOOGLE-WORKSPACE.md),
|
|
[Gmail](./GMAIL.md), [Asana](./ASANA.md), [PostHog](./POSTHOG.md), [Neon](./NEON.md), [Superagent](./SUPERAGENT.md),
|
|
[AgentMail](./AGENTMAIL.md), [Telem.AI](./TELEM.md), [iMessage Photon](./IMESSAGE-PHOTON.md), and
|
|
[Enterpret](./ENTERPRET.md). Optional credential custody:
|
|
[Vercel Connect](./VERCEL-CONNECT.md).
|
|
|
|
Post-read action: classify a new integration request, pick the right Paperclip
|
|
layer to change, and avoid creating a parallel connection framework.
|
|
|
|
## Decision Record
|
|
|
|
Board decisions from [PAP-13211](/PAP/issues/PAP-13211) make the Apps v2
|
|
substrate on the PAP-10341 branch canonical:
|
|
|
|
- **D1: Apps v2 is the substrate.** The active model is
|
|
`tool_applications`, `tool_connections`, catalog entries, profiles, policy
|
|
rules, action requests, gateway sessions, audit events, and runtime slots.
|
|
Connections v1 is retired as an implementation path.
|
|
- **D2: one credential authority per connection, brokered projections.** The
|
|
default is the Paperclip instance vault: durable third-party credentials live
|
|
in `company_secrets` as secret refs. A reviewed remote MCP method may instead
|
|
opt in to [Vercel Connect](./VERCEL-CONNECT.md), in which case Vercel is the
|
|
durable credential authority and Paperclip stores only the connector reference
|
|
and redacted grant metadata. A connection must never mix those two sources.
|
|
Adapter config, plugin config, harness credential files, and run environments
|
|
may receive only brokered or projected credentials.
|
|
- **D3: the vocabulary and three-door IA are product law.** The default product
|
|
doors are Apps, Connections, and Review. Protocol and operator-depth concepts
|
|
live behind Developer or Advanced surfaces.
|
|
- **D4: unification lands on PAP-10341.** Pages, CircleBack-style harness MCP
|
|
OAuth, provider gallery work, and plugin-provided integrations converge on
|
|
this branch instead of spawning new integration substrates.
|
|
- **D5: inbound stays thin.** External clients that call Paperclip use scoped
|
|
Paperclip tokens and existing profiles/rules. They do not get a separate
|
|
permission model.
|
|
|
|
## Canonical Object Model
|
|
|
|
Use **connection** as the unifying noun. A connection is four things:
|
|
|
|
1. A stored credential reference.
|
|
2. A capability catalog.
|
|
3. A governance layer.
|
|
4. An audit trail.
|
|
|
|
Everything else is an axis on that object:
|
|
|
|
| Axis | Values | It answers |
|
|
| --- | --- | --- |
|
|
| Direction | outbound, inbound | Who is the client? |
|
|
| Transport | MCP, native REST/OpenAPI, OAuth app install, webhook | How do bytes move? |
|
|
| Auth mode | OAuth, API key/PAT, app installation, none | What does the secret represent? |
|
|
| Credential owner | company, user, run | Whose identity acts? |
|
|
| Packaging | catalog entry, plugin, skill | How does it ship? |
|
|
|
|
MCP is a transport, not a product category. "Install the Discord app",
|
|
"connect Google Drive", and "add an MCP endpoint" all produce governed
|
|
connections with different transport/auth values.
|
|
|
|
## Layer Stack
|
|
|
|
When you are unsure where a change belongs, place it on the narrowest layer that
|
|
solves the problem:
|
|
|
|
| Layer | Owns | Examples |
|
|
| --- | --- | --- |
|
|
| Surface | user-facing Apps, Connections, Review, Developer/Advanced screens | gallery cards, setup wizard, review queue |
|
|
| Governance | profiles, bindings, allow/ask-first/block rules, quarantine, audit | read-only profile, ask-first write policy |
|
|
| Capability | action catalogs, schemas, risk classes, changed-tool review | `search_issues`, `create_comment`, schema hash |
|
|
| Credential | `company_secrets`, OAuth broker, credential resolver, token broker | Slack bot token ref, Google OAuth refresh token ref |
|
|
| Identity | actor attribution and token exchange | board user, agent run, first-party service identity |
|
|
| Transport | how the external system is reached | remote HTTP MCP, local stdio, REST/OpenAPI, webhook |
|
|
|
|
The agent should not hold a durable provider credential. It should hold a
|
|
Paperclip run/session token; the server or broker resolves the connection,
|
|
checks governance, invokes the provider, and writes audit.
|
|
|
|
## Identity vs. connections
|
|
|
|
Signing a user *in* and connecting a *resource* are different planes with
|
|
different owners, different token profiles, and different homes. Do not merge
|
|
them. This section is the public, connections-side statement of the identity
|
|
model so connector implementers inherit the rule without depending on private
|
|
identity-service documentation or re-deriving it.
|
|
|
|
| Plane | Question | Lives where | Token profile |
|
|
| --- | --- | --- | --- |
|
|
| **P1. Sign-in methods** | *Who are you?* | `paperclip-id` (id.paperclip.ing → Account) | Minimal-scope provider tokens (`openid email profile`), used once to authenticate, encrypted at rest, never exported |
|
|
| **P2. Connections (Apps)** | *What may your agents touch?* | Paperclip App instances (`tool_connections`), acquired via the **connect broker** for hosted + self-hosted | Rich-scope, long-lived resource tokens in the **instance's** encrypted vault; per-agent grants; risk-tier policy defaults |
|
|
| **P3. Login with Paperclip** | *Who may authenticate against us?* | `paperclip-id` OIDC provider + DB-backed client registry | Our ES256 ID/access tokens issued *by* us to registered RPs (instances, the broker, future third parties) |
|
|
|
|
Everything in `doc/connections/` — the [First-30 matrix](./FIRST-30-MATRIX.md),
|
|
the [connection authoring runbook](./CONNECTOR-PLAYBOOK.md), and the connect-broker work —
|
|
lives on **plane P2**. It never acquires, stores, or brokers a P1 sign-in token.
|
|
|
|
### The standing rule (D7)
|
|
|
|
Adopted as a standing rule (decision D7) with the identity-model plan. State it
|
|
verbatim in any P2 design so the app-store work cannot drift into merging the
|
|
planes:
|
|
|
|
> Sign-in tokens are never reused as resource tokens; id.paperclip.ing never
|
|
> stores resource tokens; no connections hub on the ID service.
|
|
|
|
P2 tokens flow broker → instance vault as pass-through only; the id.paperclip.ing
|
|
Account page therefore must **not** grow a "Connections" hub. The reasons to
|
|
hold the planes apart (from the plan §3):
|
|
|
|
- **Scope discipline.** Sign-in wants the narrowest grant; connections want
|
|
deliberately broad ones. One button that does both is how you grant repo
|
|
access just to log in.
|
|
- **Blast radius.** id.paperclip.ing holding every customer's Vercel/Slack/GitHub
|
|
resource tokens would make it the single juiciest target in the fleet; the
|
|
broker is intentionally pass-through.
|
|
- **Self-hosted symmetry.** Instances own their vaults, so self-hosters don't
|
|
depend on our uptime to *use* their own connections.
|
|
- **Legibility.** Sign-in and connections answer different user questions, and
|
|
every product we benchmarked (Vercel, Railway, GitHub, Google) keeps them on
|
|
separate pages with separate names.
|
|
|
|
The explicit Vercel Connect exception does not change D7 or merge P1 and P2.
|
|
The operator chooses Vercel as the P2 credential authority for an individual
|
|
connection. `id.paperclip.ing` is not involved, and neither sign-in tokens nor
|
|
provider tokens pass through it. The deployment's Vercel access token or
|
|
workload OIDC identity is bootstrap authority for that external vault, not a
|
|
provider resource credential.
|
|
|
|
### Naming alignment
|
|
|
|
Use the surface-correct name for each plane; they intentionally differ:
|
|
|
|
| Surface | Plane | Name to use |
|
|
| --- | --- | --- |
|
|
| Paperclip App instances | P2 | **"Connections"** |
|
|
| id.paperclip.ing Account | P1 | **"Ways to sign in"** |
|
|
| id.paperclip.ing admin | P3 | **"OIDC clients"** (until the app store productizes it) |
|
|
|
|
## Packaging Rule
|
|
|
|
Default to a **catalog entry** when an integration can be described as metadata:
|
|
manifest, auth config, action catalog, resource filters, and policy defaults.
|
|
|
|
Use a **plugin** only when the integration needs product code such as custom UI
|
|
pages, its own tables, workers, migrations, routines, or specialized ingestion.
|
|
A plugin may bundle catalog entries, but it must not bypass the connection,
|
|
profile, policy, credential, and audit model.
|
|
|
|
Use a **skill** for agent instructions. Skills may use connections; they must
|
|
not own durable tokens.
|
|
|
|
## Canonical Docs
|
|
|
|
- [Glossary](./GLOSSARY.md) defines product and internal terms.
|
|
- [Identity vs. connections](#identity-vs-connections) is the public statement
|
|
of the P1/P2/P3 boundary and the D7 standing rule for connections work.
|
|
- [Security threat model](./SECURITY-THREAT-MODEL.md) harvests the keeper from
|
|
[PAP-2359](/PAP/issues/PAP-2359) and maps it onto Apps v2.
|
|
- [First-30 matrix](./FIRST-30-MATRIX.md) harvests the keeper from
|
|
[PAP-2432](/PAP/issues/PAP-2432) and is the source matrix for connector
|
|
playbook work.
|
|
- [Connecting any remote MCP server](./GENERIC-REMOTE-MCP.md) is the baseline:
|
|
how an operator connects a standards-compliant remote MCP endpoint with no
|
|
Paperclip code change, and how sign-in resolves a client.
|
|
- [Connection authoring runbook](./CONNECTOR-PLAYBOOK.md) is the one
|
|
end-to-end, agent-executable guide for adding a vendor as a catalog entry on
|
|
Apps v2: research, connection-type selection, OAuth/API-key/generated-URL
|
|
setup, encrypted credential handling, branding, implementation, browser and
|
|
live-provider testing, verification, and PR submission.
|
|
- [Vercel Connect operator guide](./VERCEL-CONNECT.md) documents the optional
|
|
external credential source, deployment flags, runtime resolution, recovery,
|
|
and smoke requirements.
|
|
- [MCP access governance](../MCP-ACCESS-GOVERNANCE.md) remains the operator
|
|
runbook for the current gateway, profile, policy, approval, runtime, and audit
|
|
APIs.
|
|
|
|
## Migration Notes
|
|
|
|
Connections v1 contributed useful policy, UX, and rollout thinking, but its
|
|
implementation branch is no longer the target. When you see old tickets or code
|
|
using `connections`, `connection_grants`, or a provider-directory mental model,
|
|
translate the intent into Apps v2:
|
|
|
|
| Connections v1 intent | Apps v2 home |
|
|
| --- | --- |
|
|
| Provider directory | Apps gallery / `tool_applications` |
|
|
| Configured provider instance | Connection / `tool_connections` |
|
|
| Grant allowlist | Profiles, profile bindings, policies |
|
|
| Resource filters | Policy/profile conditions plus provider config |
|
|
| Tool broker | Tool gateway and runtime supervisor |
|
|
| Connection UX tail | Apps, Connections, Review, Developer/Advanced IA |
|
|
|
|
Do not add new work to the retired v1 branch. If an old ticket still describes a
|
|
valid product gap, retarget it to an active Apps v2 issue or close it as
|
|
superseded with a link to the replacement.
|