> ## Documentation Index
> Fetch the complete documentation index at: https://sdk.ekanos.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Proposes

> Suggest security classifications that a reviewer confirms during promotion.

`proposes` is where you tell a reviewer what you believe is true about your integration. The reviewer confirms it during **promotion** — the human review your integration passes before it's enabled for real accounts.

## Basic proposal

```ts theme={null}
export const integration = defineIntegration({
  // ...
  proposes: {
    // 'account' | 'user' | 'source'
    // Asserts that no handler reads a personal grant or session client
    credentialModel: 'account',

    tools: {
      list_recent_payments: {
        effect: 'read',
        sensitivity: 'financial',
      },
      refund_payment: {
        effect: 'write',
        sensitivity: 'financial',
      },
    },
  },
});
```

## credentialModel

```ts theme={null}
credentialModel: 'account' | 'user' | 'source';
```

What kind of credentials your integration uses. Undeclared fails closed — the workflow engine treats your tools as not machine-executable.

* **`'account'`** — credentials resolve at the account level (typical). Declaring it asserts that no handler reads a personal grant or a session client
* **`'user'`** — credentials or identity are personal to a user
* **`'source'`** — source-level credentials

## scope

```ts theme={null}
scope: 'user' | 'team';
```

Optional. Your declared intent for whether activation is per user or per team. The host assigns the real value; a `credentialModel: 'user'` + `scope: 'team'` pairing is flagged as unusual.

## Tool classifications

Optional per tool:

```ts theme={null}
tools: {
  tool_name: {
    effect: 'read' | 'write',           // Does it modify state?
    sensitivity: 'public' | 'internal' | 'pii' | 'financial',
  },
}
```

* **`effect`** — `'read'` (data fetch) or `'write'` (modifies state)
* **`sensitivity`** — what kind of data: public, internal, personally identifiable, or financial

## Key requirement

Tool names in `proposes.tools` must match declared tool names **exactly** (the raw name, not the slug-prefixed one). A proposal for a tool you didn't declare is a validation error — `proposes.tools["<name>"] does not match any declared tool` — so a rename cannot leave stale classifications behind.

`proposes` is the only place these classifications go: `credentialModel` and per-tool `effect`/`sensitivity` declared anywhere else in the definition are rejected as unrecognized keys.

## Review

A reviewer reads your proposals against your code during promotion to verify honesty. Marking a tool that moves money as `'read'` to get past a gate is what promotion review exists to catch.

## Workflow impact

If `credentialModel` is not declared, the workflow engine's tool allowlist treats your tools as not machine-executable. A tool you believe is workflow-callable will not be until `credentialModel` is declared **and confirmed** at promotion:

```ts theme={null}
// ❌ Undeclared — workflows cannot call these tools
tools: [
  { name: 'list_payments', async run(ctx, args) { /* … */ } },
]

// ✅ Declared — eligible once a reviewer confirms it
proposes: {
  credentialModel: 'account',
  tools: {
    list_payments: { effect: 'read', sensitivity: 'financial' },
  },
}
```

## Next steps

* [Integration shape](/sdk/integration-shape) — full definition structure
* [Tools](/sdk/surfaces/tools) — declare tools with classifications


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.