@probo/skills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "probo",
3
+ "interface": {
4
+ "displayName": "Probo"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "probo",
9
+ "description": "Open-source compliance workflows powered by Probo MCP",
10
+ "source": {
11
+ "source": "local",
12
+ "path": "./"
13
+ },
14
+ "policy": {
15
+ "installation": "AVAILABLE",
16
+ "authentication": "ON_INSTALL"
17
+ },
18
+ "category": "Productivity",
19
+ "homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
20
+ "repository": "https://github.com/getprobo/probo",
21
+ "license": "MIT",
22
+ "keywords": [
23
+ "probo",
24
+ "compliance",
25
+ "grc",
26
+ "mcp"
27
+ ]
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "probo",
3
+ "description": "Probo Claude Code plugins",
4
+ "owner": {
5
+ "name": "Probo Inc",
6
+ "email": "hello@probo.com"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "probo",
11
+ "description": "Open-source compliance workflows powered by Probo MCP",
12
+ "source": {
13
+ "source": "npm",
14
+ "package": "@probo/skills"
15
+ },
16
+ "homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
17
+ "repository": "https://github.com/getprobo/probo",
18
+ "license": "MIT",
19
+ "keywords": [
20
+ "probo",
21
+ "compliance",
22
+ "grc",
23
+ "mcp",
24
+ "agent-skills"
25
+ ]
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "probo",
3
+ "version": "0.1.0",
4
+ "description": "Open-source compliance workflows powered by Probo MCP (Claude Code, Codex, OpenCode)",
5
+ "author": {
6
+ "name": "Probo Inc",
7
+ "email": "hello@probo.com"
8
+ },
9
+ "homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
10
+ "repository": "https://github.com/getprobo/probo",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "probo",
14
+ "compliance",
15
+ "grc",
16
+ "mcp",
17
+ "open-source"
18
+ ],
19
+ "skills": "./skills/",
20
+ "mcpServers": "./.mcp.json"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "probo",
3
+ "version": "0.1.0",
4
+ "description": "Open-source compliance workflows powered by Probo MCP (Codex, OpenCode, Claude Code)",
5
+ "author": {
6
+ "name": "Probo Inc",
7
+ "email": "hello@probo.com"
8
+ },
9
+ "homepage": "https://github.com/getprobo/probo/tree/main/packages/skills",
10
+ "repository": "https://github.com/getprobo/probo",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "probo",
14
+ "compliance",
15
+ "grc",
16
+ "mcp",
17
+ "open-source"
18
+ ],
19
+ "skills": "./skills/",
20
+ "mcpServers": "./.mcp.json"
21
+ }
package/.mcp.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "probo": {
4
+ "type": "http",
5
+ "url": "${PROBO_BASE_URL}/mcp/v1"
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,170 @@
1
+ <!--
2
+ Copyright (c) 2026 Probo Inc <hello@probo.com>.
3
+
4
+ Permission to use, copy, modify, and/or distribute this software for any
5
+ purpose with or without fee is hereby granted, provided that the above
6
+ copyright notice and this permission notice appear in all copies.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
15
+ -->
16
+
17
+ # Multi-agent compatibility
18
+
19
+ `@probo/skills` targets **Claude Code**, **Codex**, **OpenCode**, and
20
+ other MCP-capable agents (including **Cursor**). The portable core is Probo
21
+ MCP plus Agent Skills–compatible `SKILL.md` files.
22
+
23
+ ## What works where
24
+
25
+ | Component | Claude Code | Codex | OpenCode | Cursor |
26
+ | --- | --- | --- | --- | --- |
27
+ | Probo MCP (OAuth) | ✅ Plugin `.mcp.json` | ✅ `.codex-plugin` + `.mcp.json` | ✅ Manual MCP config | ✅ IDE MCP settings |
28
+ | Skills (`SKILL.md`) | ✅ `skills/` | ✅ `skills/` via `.codex-plugin` | ✅ `.opencode/skills/` or `.claude/skills/` | ✅ Copy/symlink to `.cursor/skills/` |
29
+ | Commands | ✅ `commands/` → `/probo:…` | ⚠️ Use skills instead | ⚠️ Native `skill` tool | ❌ Use skill or rules |
30
+ | Plugin manifest | `.claude-plugin/` | `.codex-plugin/` | Discovery paths (no manifest) | No native manifest |
31
+ | Marketplace catalog | `.claude-plugin/marketplace.json` (repo root or package) | `.agents/plugins/marketplace.json` (repo root or package) | — | — |
32
+
33
+ ## Probo MCP (all agents)
34
+
35
+ Set the instance URL:
36
+
37
+ ```bash
38
+ export PROBO_BASE_URL="https://your-probo-instance.example.com"
39
+ ```
40
+
41
+ Endpoint: `${PROBO_BASE_URL}/mcp/v1` (HTTP, OAuth 2.0). Do not configure a
42
+ static bearer token — OAuth discovery uses
43
+ `/.well-known/oauth-protected-resource`.
44
+
45
+ ### Claude Code
46
+
47
+ **From the monorepo or GitHub** (repo-root catalog at
48
+ `.claude-plugin/marketplace.json`):
49
+
50
+ ```bash
51
+ claude plugin marketplace add getprobo/probo
52
+ # or, from a local clone:
53
+ claude plugin marketplace add .
54
+ claude plugin install probo@probo
55
+ claude mcp login probo # or /mcp in session
56
+ /probo:access-review Q3 GitHub review
57
+ ```
58
+
59
+ **From the package directory** (catalog resolves `@probo/skills` from npm):
60
+
61
+ ```bash
62
+ claude plugin marketplace add ./packages/skills/.claude-plugin
63
+ claude plugin install probo@probo
64
+ claude mcp login probo
65
+ ```
66
+
67
+ Or install the plugin directory directly:
68
+
69
+ ```bash
70
+ claude --plugin-dir ./packages/skills
71
+ ```
72
+
73
+ ### Codex
74
+
75
+ **From the monorepo or GitHub** (repo-root catalog at
76
+ `.agents/plugins/marketplace.json`):
77
+
78
+ ```bash
79
+ codex plugin marketplace add getprobo/probo
80
+ # or, from a local clone:
81
+ codex plugin marketplace add .
82
+ codex plugin install probo@probo
83
+ codex mcp login probo
84
+ ```
85
+
86
+ **From the package directory** (catalog at
87
+ `packages/skills/.agents/plugins/marketplace.json`):
88
+
89
+ ```bash
90
+ codex plugin marketplace add ./packages/skills
91
+ codex plugin install probo@probo
92
+ codex mcp login probo
93
+ ```
94
+
95
+ Or install the plugin directory directly:
96
+
97
+ ```bash
98
+ codex plugin install ./packages/skills
99
+ codex mcp login probo
100
+ ```
101
+
102
+ Skills load from `./skills/` via `.codex-plugin/plugin.json`. The repo-root
103
+ marketplace `source.path` is `./packages/skills`; the package-level
104
+ catalog uses `./` (plugin package root).
105
+
106
+ ### OpenCode
107
+
108
+ OpenCode discovers skills at `.opencode/skills/`, `.claude/skills/`, and
109
+ `~/.config/opencode/skills/`. Options:
110
+
111
+ **Option A — symlink from this package:**
112
+
113
+ ```bash
114
+ mkdir -p .opencode/skills
115
+ ln -s ../../packages/skills/skills/access-review .opencode/skills/access-review
116
+ ln -s ../../packages/skills/skills/open-source-compliance .opencode/skills/open-source-compliance
117
+ ```
118
+
119
+ **Option B — Claude Code bridge:** install
120
+ [`opencode-claude-code-bridge`](https://www.npmjs.com/package/opencode-claude-code-bridge)
121
+ to import Claude plugins and MCP configs into OpenCode.
122
+
123
+ Configure Probo MCP in `opencode.json` or global OpenCode MCP settings, then
124
+ authenticate. Invoke via the native `skill` tool (`access-review`).
125
+
126
+ ### Cursor
127
+
128
+ 1. Add Probo MCP in Cursor settings (HTTP URL: `${PROBO_BASE_URL}/mcp/v1`,
129
+ OAuth).
130
+ 2. Copy or symlink skills into `.cursor/skills/`:
131
+
132
+ ```bash
133
+ mkdir -p .cursor/skills
134
+ cp -r packages/skills/skills/access-review .cursor/skills/
135
+ ```
136
+
137
+ Reference the skill in chat or add a Cursor rule pointing at the skill.
138
+
139
+ ## Portable vs agent-specific paths
140
+
141
+ | Path | Portable? |
142
+ | --- | --- |
143
+ | `skills/<name>/SKILL.md` | ✅ Agent Skills standard |
144
+ | `skills/<name>/references/*.md` | ✅ Relative to skill directory |
145
+ | `.mcp.json` with `${PROBO_BASE_URL}` | ✅ Standard env var |
146
+ | `${CLAUDE_PLUGIN_ROOT}` | ❌ Claude Code only — avoid in skill bodies |
147
+ | `commands/*.md` | Claude Code slash commands only |
148
+
149
+ Skill bodies use **relative** `references/` paths so they work once the skill
150
+ directory is discovered, regardless of which agent loads it.
151
+
152
+ ## npm package layout
153
+
154
+ ```
155
+ @probo/skills/
156
+ .claude-plugin/plugin.json # Claude Code manifest
157
+ .claude-plugin/marketplace.json # Claude marketplace (npm)
158
+ .codex-plugin/plugin.json # Codex manifest
159
+ .agents/plugins/marketplace.json # Codex marketplace (package-local)
160
+ .mcp.json # Shared MCP wiring
161
+ skills/ # Shared skills (all agents)
162
+ commands/ # Claude Code commands only
163
+ ```
164
+
165
+ Repo root (monorepo / `getprobo/probo` Git installs):
166
+
167
+ ```
168
+ .claude-plugin/marketplace.json # Claude marketplace → packages/skills
169
+ .agents/plugins/marketplace.json # Codex marketplace → packages/skills
170
+ ```
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # @probo/skills
2
+
3
+ Multi-agent compliance skills for open-source GRC workflows. Ships Agent
4
+ Skills–compatible instructions and wires agents to the [Probo MCP
5
+ API](https://github.com/getprobo/probo/tree/main/pkg/server/api/mcp/v1) via
6
+ OAuth 2.0.
7
+
8
+ **Supported agents:** Claude Code, Codex, OpenCode, Cursor (MCP + skills).
9
+
10
+ Marketplace catalogs: `.claude-plugin/marketplace.json` at the repo root or
11
+ under `packages/skills/` (Claude Code), `.agents/plugins/marketplace.json` at
12
+ the repo root or under `packages/skills/` (Codex). See
13
+ [COMPATIBILITY.md](./COMPATIBILITY.md).
14
+
15
+ ## Install
16
+
17
+ ### From GitHub or npm
18
+
19
+ **From GitHub** (repo-root catalog at `.claude-plugin/marketplace.json`):
20
+
21
+ ```bash
22
+ claude plugin marketplace add getprobo/probo
23
+ # or, from a local clone:
24
+ claude plugin marketplace add .
25
+ claude plugin install probo@probo
26
+ ```
27
+
28
+ **From the package directory** (catalog at
29
+ `packages/skills/.claude-plugin/marketplace.json`, resolves `@probo/skills`
30
+ from npm):
31
+
32
+ ```bash
33
+ claude plugin marketplace add ./packages/skills/.claude-plugin
34
+ claude plugin install probo@probo
35
+ ```
36
+
37
+ When consuming the published package, the package-level marketplace entry
38
+ resolves `@probo/skills` from npm (see
39
+ `packages/skills/.claude-plugin/marketplace.json`).
40
+
41
+ ### Configure Probo MCP
42
+
43
+ Set your Probo instance URL before starting Claude Code:
44
+
45
+ ```bash
46
+ export PROBO_BASE_URL="https://your-probo-instance.example.com"
47
+ ```
48
+
49
+ The plugin `.mcp.json` connects to `${PROBO_BASE_URL}/mcp/v1`. Probo MCP
50
+ authenticates with **OAuth 2.0** — no API token or bearer header is required in
51
+ the plugin config. On first use, sign in from Claude Code:
52
+
53
+ ```text
54
+ /mcp
55
+ ```
56
+
57
+ Or from your shell:
58
+
59
+ ```bash
60
+ claude mcp login probo
61
+ ```
62
+
63
+ Claude Code discovers Probo's authorization server via
64
+ `/.well-known/oauth-protected-resource` and stores tokens securely.
65
+
66
+ ### Local development
67
+
68
+ ```bash
69
+ claude --plugin-dir ./packages/skills
70
+ ```
71
+
72
+ ## What's included
73
+
74
+ | Component | Location | Purpose |
75
+ | --- | --- | --- |
76
+ | MCP | `.mcp.json` | Probo API connection |
77
+ | Skills | `skills/` | Compliance workflows |
78
+ | Commands | `commands/` | `access-review`, `missing-signatures` — semi-auto workflows |
79
+
80
+ Skills: `/probo:<skill-name>` (e.g. `/probo:open-source-compliance`, `/probo:missing-signatures`).
81
+
82
+ Commands: `/probo:<command-name>` (e.g. `/probo:access-review`, `/probo:missing-signatures`).
83
+
84
+ ## Adding content
85
+
86
+ See [`contrib/claude/skills.md`](../../contrib/claude/skills.md).
87
+
88
+ ```bash
89
+ npm --workspace @probo/skills run validate
90
+ claude --plugin-dir ./packages/skills
91
+ ```
92
+
93
+ ## Release
94
+
95
+ Published to npm as `@probo/skills`. See
96
+ [`contrib/claude/release/skills.md`](../../contrib/claude/release/skills.md).
@@ -0,0 +1,17 @@
1
+ ---
2
+ description: Run a semi-automated access review on a Probo campaign (Claude Code slash command).
3
+ argument-hint: [campaign name or id]
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Access review command
8
+
9
+ Execute the `access-review` skill for campaign `$ARGUMENTS`.
10
+
11
+ 1. Load `skills/access-review/SKILL.md` from the plugin package root.
12
+ 2. Load reference docs from `skills/access-review/references/` as directed by
13
+ the skill.
14
+ 3. Follow the skill workflow exactly.
15
+
16
+ Do not duplicate skill logic here — the skill is the canonical workflow shared
17
+ with Codex and OpenCode.
@@ -0,0 +1,17 @@
1
+ ---
2
+ description: Report missing document signatures and pending quorum approvals per person (Claude Code slash command).
3
+ argument-hint: [organization name or id]
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Missing signatures command
8
+
9
+ Execute the `missing-signatures` skill for organization `$ARGUMENTS`.
10
+
11
+ 1. Load `skills/missing-signatures/SKILL.md` from the plugin package root.
12
+ 2. Load reference docs from `skills/missing-signatures/references/` as directed
13
+ by the skill.
14
+ 3. Follow the skill workflow exactly.
15
+
16
+ Do not duplicate skill logic here — the skill is the canonical workflow shared
17
+ with Codex and OpenCode.
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@probo/skills",
3
+ "version": "0.1.0",
4
+ "description": "Multi-agent compliance skills for open-source GRC (Claude Code, Codex, OpenCode) powered by Probo MCP",
5
+ "private": false,
6
+ "scripts": {
7
+ "validate": "node scripts/validate.mjs",
8
+ "release": "npm run validate && npm publish --access public",
9
+ "prepublishOnly": "npm run validate"
10
+ },
11
+ "author": {
12
+ "name": "Probo Inc",
13
+ "email": "hello@probo.com"
14
+ },
15
+ "files": [
16
+ ".claude-plugin",
17
+ ".codex-plugin",
18
+ ".agents",
19
+ "skills",
20
+ "commands",
21
+ ".mcp.json",
22
+ "README.md",
23
+ "COMPATIBILITY.md"
24
+ ],
25
+ "keywords": [
26
+ "claude-code",
27
+ "agent-skills",
28
+ "codex",
29
+ "opencode",
30
+ "probo",
31
+ "compliance",
32
+ "grc",
33
+ "mcp",
34
+ "open-source"
35
+ ],
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/getprobo/probo.git",
40
+ "directory": "packages/skills"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/getprobo/probo/issues"
44
+ },
45
+ "homepage": "https://github.com/getprobo/probo/tree/main/packages/skills#readme",
46
+ "publishConfig": {
47
+ "access": "public"
48
+ }
49
+ }
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: access-review
3
+ description: Run a semi-automated Probo access review campaign. Use when the user wants to review access entries, decide approve/revoke/escalate, or resume an in-progress campaign with MCP and .probo/access-reviews/ notes.
4
+ compatibility: Requires Probo MCP (OAuth 2.0) and file write access for .probo/access-reviews/
5
+ ---
6
+
7
+ # Access review
8
+
9
+ Run a **semi-automated** access review for campaign `$ARGUMENTS` (or ask the
10
+ user for the campaign name). Review entries only — do not create, start,
11
+ cancel, or close campaigns.
12
+
13
+ Before executing, read these files **relative to this skill directory**:
14
+
15
+ - `references/mcp-tools.md` — MCP tool names, inputs, pagination
16
+ - `references/decision-rubric.md` — semi-auto decision rules
17
+ - `references/notes-format.md` — working memory file schema
18
+
19
+ ## Preconditions
20
+
21
+ 1. Probo MCP must be connected. If tools fail with auth errors, stop and tell
22
+ the user to complete OAuth sign-in for the Probo MCP server in their agent
23
+ (Claude Code: `/mcp` or `claude mcp login probo`; Codex: `codex mcp login
24
+ probo`; OpenCode/Cursor: configure MCP in settings then authenticate).
25
+ 2. Resolve the campaign from `$ARGUMENTS` (name match or GID). If ambiguous,
26
+ list `listAccessReviewCampaigns` results and ask the user to pick one.
27
+ 3. Campaign `status` must be `IN_PROGRESS` or `PENDING_ACTIONS`. Stop with a
28
+ clear message for `DRAFT`, `COMPLETED`, or `CANCELLED`.
29
+
30
+ ## Working notes file
31
+
32
+ Create or resume `.probo/access-reviews/<campaign-slug>.md` per
33
+ `references/notes-format.md`. Create `.probo/access-reviews/` if missing.
34
+
35
+ ## Workflow
36
+
37
+ ### 1. Orient
38
+
39
+ - Call `getAccessReviewStatistics` for the campaign.
40
+ - Summarize totals and pending count for the user.
41
+ - If no pending entries, report completion and stop.
42
+
43
+ ### 2. Fetch batch
44
+
45
+ - Call `listAccessEntries` with `campaign_id`, `filter.decision: PENDING`,
46
+ `size: 50`.
47
+ - Use `last_cursor` from the notes file when resuming.
48
+
49
+ ### 3. Classify each entry
50
+
51
+ Apply `references/decision-rubric.md`:
52
+
53
+ | Class | Action |
54
+ | --- | --- |
55
+ | **Auto** | Queue for `recordAccessReviewEntryDecisions` |
56
+ | **Ambiguous** | Present to user; do not write yet |
57
+ | **Skip** | Log in notes only (no API write) |
58
+
59
+ Hold auto decisions in memory until step 4 succeeds — do not append them to the
60
+ notes file yet.
61
+
62
+ ### 4. Write auto decisions
63
+
64
+ - Batch via `recordAccessReviewEntryDecisions` when possible.
65
+ - Non-`APPROVED` decisions **must** include `decision_note`.
66
+ - On MCP error, stop and do not advance `last_cursor` or update entry notes.
67
+ - After a successful API response, append each recorded auto decision to the
68
+ notes file `## Entry notes` table.
69
+
70
+ ### 5. Present ambiguous entries
71
+
72
+ Show email, roles, flags, proposed decision, rationale. Record only after
73
+ explicit user confirmation.
74
+
75
+ ### 6. Checkpoint
76
+
77
+ Update notes: `last_cursor`, session log, `updated_at`. Ask to continue if
78
+ `next_cursor` is set.
79
+
80
+ ## Hard rules
81
+
82
+ - Never call `closeAccessReviewCampaign` or campaign setup mutations unless
83
+ the user explicitly requests setup work outside this skill.
84
+ - Never invent entry IDs or decisions — use MCP responses only.
85
+ - Never record non-`APPROVED` without `decision_note`.
@@ -0,0 +1,60 @@
1
+ # Semi-auto decision rubric
2
+
3
+ Classify each `PENDING` entry before writing to Probo.
4
+
5
+ ## Auto — record without asking
6
+
7
+ Apply the **first matching rule** (top to bottom). Always set `decision_note`
8
+ for non-`APPROVED` decisions.
9
+
10
+ | Condition | Decision | decision_note template |
11
+ | --- | --- | --- |
12
+ | `TERMINATED_USER` flag | `REVOKE` | Terminated user — access no longer required |
13
+ | `CONTRACTOR_EXPIRED` flag | `REVOKE` | Contractor engagement ended |
14
+ | `active === false` and no `NEW` tag | `REVOKE` | Account inactive at source |
15
+ | `ORPHANED` flag and `active === false` | `REVOKE` | Orphaned inactive account |
16
+ | `ORPHANED` flag only, `active !== false` | `ESCALATE` | Orphaned account still active — needs owner |
17
+ | `SHARED_ACCOUNT` flag | `ESCALATE` | Shared account — assign individual owner |
18
+ | `SOD_CONFLICT` flag | `ESCALATE` | Segregation of duties conflict |
19
+ | `PRIVILEGED_ACCESS` or `ROLE_CREEP` flag | `ESCALATE` | Privileged access requires explicit approval |
20
+ | `is_admin === true` and (`DORMANT` flag or last_login very stale) | `ESCALATE` | Admin access dormant — confirm business need |
21
+ | `account_type === SERVICE_ACCOUNT`, active, no danger flags | `APPROVED` | Service account with expected access |
22
+ | Active user, no flags (or only `NONE`), not admin, `incremental_tag !== NEW` | `APPROVED` | Routine access reaffirmed |
23
+
24
+ "Very stale" last_login: no login in 90+ days when `last_login` is present.
25
+
26
+ ## Ambiguous — show user, do not write
27
+
28
+ | Condition | Suggested default | Why ambiguous |
29
+ | --- | --- | --- |
30
+ | `incremental_tag === NEW` | `ESCALATE` | New access since last campaign |
31
+ | `NO_BUSINESS_JUSTIFICATION` flag | `ESCALATE` or `REVOKE` | Needs human judgment |
32
+ | `OUT_OF_DEPARTMENT` flag | `ESCALATE` | Role/department mismatch |
33
+ | `EXCESSIVE` or `ROLE_MISMATCH` flag | `ESCALATE` | Role change needs context |
34
+ | `is_admin === true` without dormant signals | `ESCALATE` | Admin approvals need explicit sign-off |
35
+ | `mfa_status === DISABLED` and (`is_admin` or privileged flags) | `ESCALATE` | MFA gap on sensitive access |
36
+ | `auth_method === API_KEY` or `PASSWORD` on production-like roles | `ESCALATE` | Non-SSO auth on sensitive access |
37
+ | Multiple conflicting flags | `ESCALATE` | Rubric rules disagree |
38
+ | `active === null` with revoke-leaning flags | `ESCALATE` | Unknown activity state |
39
+
40
+ Present the suggested decision; wait for explicit user confirmation.
41
+
42
+ ## Flagging before decision
43
+
44
+ Do not auto-flag unless the user asks. When reviewing ambiguous entries, you
45
+ may **suggest** `flagAccessReviewEntry` if Probo shows `NONE` but signals are
46
+ obvious (e.g. admin + 180d no login → suggest `DORMANT`).
47
+
48
+ ## Decision notes
49
+
50
+ - `APPROVED` — `decision_note` optional
51
+ - `REVOKE`, `DEFER`, `ESCALATE` — `decision_note` **required** (MCP rejects empty)
52
+ - Keep notes short, factual, auditable. Reference flags and activity signals.
53
+
54
+ ## DEFER vs ESCALATE
55
+
56
+ - `ESCALATE` — needs another reviewer or manager (security, HR, app owner)
57
+ - `DEFER` — modify access (role change, downgrade) before final approval; use
58
+ when the user indicates access should change rather than fully revoke
59
+
60
+ Default to `ESCALATE` when unsure.
@@ -0,0 +1,93 @@
1
+ # Access review MCP tools
2
+
3
+ All tools are on the Probo MCP server (`probo`). Read each tool schema before
4
+ calling.
5
+
6
+ ## Read
7
+
8
+ ### `listAccessReviewCampaigns`
9
+
10
+ List campaigns for an organization. Use to resolve `$ARGUMENTS` to a campaign
11
+ when the user provides a name instead of a GID.
12
+
13
+ Required: `organization_id`
14
+
15
+ ### `listAccessEntries`
16
+
17
+ List entries for a campaign. Primary data source for this command.
18
+
19
+ | Field | Usage |
20
+ | --- | --- |
21
+ | `campaign_id` | Campaign GID |
22
+ | `filter.decision` | Use `PENDING` for review batches |
23
+ | `filter.flag` | Optional — focus on a flag (e.g. `TERMINATED_USER`) |
24
+ | `filter.incremental_tag` | Optional — `NEW`, `REMOVED`, `UNCHANGED` |
25
+ | `filter.is_admin` | Optional boolean |
26
+ | `filter.active` | Optional boolean |
27
+ | `size` | Page size; use `50` per batch |
28
+ | `cursor` | Resume pagination; store in notes file as `last_cursor` |
29
+
30
+ Returns `entries[]` and `next_cursor`.
31
+
32
+ ### `getAccessReviewStatistics`
33
+
34
+ Required: `campaign_id`
35
+
36
+ Returns `statistics` with `total_count`, `decision_counts`, `flag_counts`,
37
+ `incremental_tag_counts`. Call at the start of each run and after large batches.
38
+
39
+ ## Write (semi-auto command)
40
+
41
+ ### `recordAccessReviewEntryDecisions`
42
+
43
+ Preferred for auto batch. Input `decisions[]` with:
44
+
45
+ - `access_review_entry_id` (required)
46
+ - `decision` — `APPROVED`, `REVOKE`, `DEFER`, `ESCALATE` (not `PENDING`)
47
+ - `decision_note` — required for non-`APPROVED`
48
+
49
+ ### `recordAccessReviewEntryDecision`
50
+
51
+ Use for single entries after user confirms an ambiguous case.
52
+
53
+ ### `flagAccessReviewEntry`
54
+
55
+ Optional when the user agrees a flag is missing. Input:
56
+
57
+ - `access_review_entry_id`
58
+ - `flags[]` — see rubric for valid values
59
+ - `flag_reasons[]` — optional strings
60
+
61
+ ## Out of scope for this command
62
+
63
+ Do not call unless the user explicitly asks for campaign setup:
64
+
65
+ - `closeAccessReviewCampaign`
66
+ - `cancelAccessReviewCampaign`
67
+ - `startAccessReviewCampaign`
68
+ - `createAccessReviewCampaign`
69
+ - `createAccessReviewSource` / source mutations
70
+
71
+ ## Entry fields (review signals)
72
+
73
+ | Field | Review use |
74
+ | --- | --- |
75
+ | `email`, `full_name` | Identity |
76
+ | `roles`, `job_title` | Access level |
77
+ | `is_admin` | Heightened scrutiny |
78
+ | `active` | `false` often supports revoke |
79
+ | `mfa_status` | `DISABLED` on privileged access → escalate |
80
+ | `auth_method` | `API_KEY`, `SERVICE_ACCOUNT` context |
81
+ | `account_type` | `SERVICE_ACCOUNT` vs `USER` |
82
+ | `last_login` | Dormancy signal |
83
+ | `incremental_tag` | `NEW` needs extra scrutiny |
84
+ | `flags`, `flag_reasons` | Primary risk signals |
85
+ | `decision` | Target `PENDING` entries only |
86
+
87
+ ## Pagination and resume
88
+
89
+ 1. Read `last_cursor` from the notes file.
90
+ 2. Pass it to `listAccessEntries` to continue where the last batch stopped.
91
+ 3. Write the new `next_cursor` back after each successful batch.
92
+ 4. When `next_cursor` is null/empty, the pending page is exhausted — refresh
93
+ statistics to confirm remaining `PENDING` count.
@@ -0,0 +1,59 @@
1
+ # Access review notes file
2
+
3
+ Path: `.probo/access-reviews/<campaign-slug>.md`
4
+
5
+ `<campaign-slug>` — lowercase campaign name with non-alphanumerics replaced by
6
+ hyphens (e.g. `Q3 GitHub Review` → `q3-github-review`).
7
+
8
+ ## Template
9
+
10
+ ```markdown
11
+ # Access review: <campaign name>
12
+
13
+ campaign_id: <gid>
14
+ organization_id: <gid>
15
+ campaign_status: <IN_PROGRESS|PENDING_ACTIONS>
16
+ last_cursor:
17
+ updated_at: <ISO-8601 UTC>
18
+
19
+ ## Session log
20
+
21
+ - <ISO-8601> — Started review. Pending: <n>.
22
+ - <ISO-8601> — Batch complete. Auto: <a> approved, <r> revoked, <e> escalated, <d> deferred. Ambiguous: <u>. Cursor: <cursor or done>.
23
+
24
+ ## Entry notes
25
+
26
+ | entry_id | email | decision | auto | rationale |
27
+ |----------|-------|----------|------|-----------|
28
+ | gid://… | user@example.com | REVOKE | yes | Terminated user flag |
29
+
30
+ ## Ambiguous (awaiting user)
31
+
32
+ | entry_id | email | flags | suggested | question |
33
+ |----------|-------|-------|-----------|----------|
34
+ | gid://… | admin@example.com | NEW, PRIVILEGED_ACCESS | ESCALATE | New admin — approve or revoke? |
35
+ ```
36
+
37
+ ## Field rules
38
+
39
+ | Field | Rule |
40
+ | --- | --- |
41
+ | `last_cursor` | Empty on fresh run. Set to `listAccessEntries` `next_cursor` after each successful batch. Clear when null (pagination done). |
42
+ | `updated_at` | Update on every file write |
43
+ | `auto` column | `yes` after a successful API write via semi-auto rubric; `no` if user confirmed |
44
+ | Session log | Append-only; one line per batch or major event |
45
+ | Ambiguous table | Remove rows after user confirms and decision is recorded |
46
+
47
+ ## Resume behavior
48
+
49
+ 1. If the file exists, read `campaign_id`, `last_cursor`, and ambiguous rows.
50
+ 2. Confirm with the user that resuming the same campaign is intended.
51
+ 3. Continue `listAccessEntries` from `last_cursor` if set; otherwise start from
52
+ the first pending page.
53
+ 4. Do not duplicate entry notes for IDs already in the table with a final
54
+ decision recorded after a successful API write.
55
+
56
+ ## Git
57
+
58
+ Do not commit or push this file unless the user asks. It is working memory for
59
+ the review session.
@@ -0,0 +1,109 @@
1
+ ---
2
+ name: missing-signatures
3
+ description: Report who is missing document signatures or quorum approvals in Probo. Use when the user wants a per-person recap of unsigned signature requests, pending approval decisions, or document signing compliance status.
4
+ compatibility: Requires Probo MCP (OAuth 2.0) and file write access for .probo/missing-signatures/
5
+ ---
6
+
7
+ # Missing signatures report
8
+
9
+ Build a **read-only, per-person recap** of outstanding document obligations for
10
+ organization `$ARGUMENTS` (or ask the user for the organization name). Cover:
11
+
12
+ 1. **Signature requests** — `REQUESTED` but not `SIGNED` on a published version
13
+ 2. **Quorum approvals** — `PENDING` decisions on a `PENDING` approval quorum
14
+ while the version is `PENDING_APPROVAL`
15
+
16
+ Before executing, read these files **relative to this skill directory**:
17
+
18
+ - `references/mcp-tools.md` — MCP tool names, inputs, pagination
19
+ - `references/report-format.md` — per-person recap and summary layout
20
+ - `references/notes-format.md` — working memory for resumable scans
21
+
22
+ ## Preconditions
23
+
24
+ 1. Probo MCP must be connected. If tools fail with auth errors, stop and tell
25
+ the user to complete OAuth sign-in for the Probo MCP server in their agent
26
+ (Claude Code: `/mcp` or `claude mcp login probo`; Codex: `codex mcp login
27
+ probo`; OpenCode/Cursor: configure MCP in settings then authenticate).
28
+ 2. Resolve the organization from `$ARGUMENTS` (name match or GID). If ambiguous,
29
+ call `listOrganizations` and ask the user to pick one.
30
+ 3. This skill is **reporting only**. Do not request signatures, cancel requests,
31
+ publish documents, or submit approval decisions unless the user explicitly
32
+ asks for follow-up actions outside this report.
33
+
34
+ ## Working notes file
35
+
36
+ Create or resume `.probo/missing-signatures/<org-slug>.md` per
37
+ `references/notes-format.md`. Create `.probo/missing-signatures/` if missing.
38
+
39
+ ## Workflow
40
+
41
+ ### 1. Orient
42
+
43
+ - Record `organization_id` in the notes file.
44
+ - If resuming, read `last_document_cursor` and cached `profile_cache` from
45
+ notes.
46
+ - Tell the user whether this is a fresh scan or a resume.
47
+
48
+ ### 2. Scan documents (paginated)
49
+
50
+ For each page from `listDocuments`:
51
+
52
+ - Skip `ARCHIVED` documents.
53
+ - Call `listDocumentVersions` for the document.
54
+ - For each version, branch on `status`:
55
+
56
+ | Version status | What to check |
57
+ | --- | --- |
58
+ | `PUBLISHED` | `listDocumentVersionSignatures` with `filter.states: ["REQUESTED"]` |
59
+ | `PENDING_APPROVAL` | `listDocumentVersionApprovalQuorums`; for each quorum with `status: PENDING`, `listDocumentVersionApprovalDecisions` with `filter.states: ["PENDING"]` |
60
+
61
+ Prefer the **current published** version (`current_published_major` /
62
+ `current_published_minor` on the document) when multiple published minors exist.
63
+ Still scan all `PUBLISHED` versions if the user asked for exhaustive coverage.
64
+
65
+ Paginate every list call. Store `last_document_cursor` after each document page
66
+ so a large org can be resumed.
67
+
68
+ ### 3. Resolve people
69
+
70
+ Collect unique `signed_by` and `approver_id` profile GIDs. Resolve each once via
71
+ `getUser` and cache `full_name` and `email_address` in the notes file. Never
72
+ invent names.
73
+
74
+ ### 4. Build per-person recap
75
+
76
+ Aggregate findings by profile. Each item is either:
77
+
78
+ | Type | Meaning |
79
+ | --- | --- |
80
+ | `signature` | Signature requested, not yet signed |
81
+ | `approval` | Quorum approval decision still pending |
82
+
83
+ Use `references/report-format.md` for the output layout. Sort people by
84
+ `full_name`, then email.
85
+
86
+ ### 5. Present summary
87
+
88
+ Show:
89
+
90
+ - Total people with at least one outstanding item
91
+ - Count by type (signatures vs approvals)
92
+ - Count by document
93
+ - The per-person recap tables
94
+
95
+ If the scan is incomplete (more document pages), say so and offer to continue.
96
+
97
+ ### 6. Checkpoint
98
+
99
+ Update notes: `last_document_cursor`, `profile_cache`, session log, `updated_at`.
100
+ Clear `last_document_cursor` when the document pagination is exhausted.
101
+
102
+ ## Hard rules
103
+
104
+ - Never call write mutations (`requestDocumentVersionSignature`,
105
+ `cancelSignatureRequest`, `publishDocument`, `voidDocumentVersionApproval`)
106
+ unless the user explicitly requests action after reviewing the report.
107
+ - Never invent profile IDs, document titles, or states — use MCP responses only.
108
+ - Include document title, version (`major.minor`), and `requested_at` or quorum
109
+ `created_at` on every line item so the report is audit-ready.
@@ -0,0 +1,143 @@
1
+ # Missing signatures MCP tools
2
+
3
+ All tools are on the Probo MCP server (`probo`). Read each tool schema before
4
+ calling.
5
+
6
+ ## Organization scope
7
+
8
+ ### `listOrganizations`
9
+
10
+ List organizations the caller can access. Use to resolve `$ARGUMENTS` when the
11
+ user provides a name instead of a GID.
12
+
13
+ ### `listUsers`
14
+
15
+ Resolve profile display fields. `users[]` entries are `Profile` objects.
16
+
17
+ | Field | Usage |
18
+ | --- | --- |
19
+ | `organization_id` | Required — organization GID |
20
+ | `size` | Page size; use `100` when prefetching is helpful |
21
+ | `cursor` | Pagination |
22
+
23
+ Prefer `getUser` for individual lookups when building the recap; use `listUsers`
24
+ only when bulk prefetch is faster.
25
+
26
+ ### `getUser`
27
+
28
+ Required: `id` (profile GID)
29
+
30
+ Returns `user` with `full_name`, `email_address`, `state`. Cache results in the
31
+ notes file to avoid repeat calls.
32
+
33
+ ## Documents and versions
34
+
35
+ ### `listDocuments`
36
+
37
+ Primary iterator for the scan.
38
+
39
+ | Field | Usage |
40
+ | --- | --- |
41
+ | `organization_id` | Required |
42
+ | `size` | Use `25` per page |
43
+ | `cursor` | Store in notes as `last_document_cursor` |
44
+ | `filter.status` | Optional — omit archived docs in post-processing or pass active-only if supported |
45
+
46
+ Returns `documents[]` and `next_cursor`. Each document includes
47
+ `current_published_major`, `current_published_minor`, `status`.
48
+
49
+ ### `getDocument`
50
+
51
+ Use when you need fresh `current_published_*` fields for one document.
52
+
53
+ ### `listDocumentVersions`
54
+
55
+ Required: `document_id`
56
+
57
+ | Field | Usage |
58
+ | --- | --- |
59
+ | `filter.statuses` | `["PUBLISHED"]` or `["PENDING_APPROVAL"]` to narrow |
60
+ | `size` / `cursor` | Paginate when a document has many versions |
61
+
62
+ Returns `document_versions[]` with `title`, `major`, `minor`, `status`.
63
+
64
+ ### `getDocumentVersion`
65
+
66
+ Use when you need a single version's metadata without listing all versions.
67
+
68
+ ## Signature gaps (published versions)
69
+
70
+ ### `listDocumentVersionSignatures`
71
+
72
+ Required: `document_version_id`
73
+
74
+ | Field | Usage |
75
+ | --- | --- |
76
+ | `filter.states` | `["REQUESTED"]` for outstanding signature requests |
77
+ | `size` / `cursor` | Paginate |
78
+
79
+ Returns `document_version_signatures[]`. Key fields:
80
+
81
+ | Field | Report use |
82
+ | --- | --- |
83
+ | `signed_by` | Profile GID — group by person |
84
+ | `state` | `REQUESTED` = missing signature |
85
+ | `requested_at` | When the request was sent |
86
+ | `signed_at` | `null` while outstanding |
87
+
88
+ ### `getDocumentVersionSignature`
89
+
90
+ Use for detail on a single signature row if needed.
91
+
92
+ ## Quorum approval gaps (pending approval versions)
93
+
94
+ ### `listDocumentVersionApprovalQuorums`
95
+
96
+ Required: `document_version_id`
97
+
98
+ Returns `approval_quorums[]`. Only process quorums with `status: PENDING`.
99
+
100
+ ### `getDocumentVersionApprovalQuorum`
101
+
102
+ Use when you need quorum metadata for one version.
103
+
104
+ ### `listDocumentVersionApprovalDecisions`
105
+
106
+ Required: `quorum_id`
107
+
108
+ | Field | Usage |
109
+ | --- | --- |
110
+ | `filter.states` | `["PENDING"]` for outstanding approvers |
111
+ | `size` / `cursor` | Paginate |
112
+
113
+ Returns `approval_decisions[]`. Key fields:
114
+
115
+ | Field | Report use |
116
+ | --- | --- |
117
+ | `approver_id` | Profile GID — group by person |
118
+ | `state` | `PENDING` = missing approval |
119
+ | `decided_at` | `null` while outstanding |
120
+ | `comment` | Include if present |
121
+
122
+ ### `getDocumentVersionApprovalDecision`
123
+
124
+ Use for detail on a single decision row if needed.
125
+
126
+ ## Out of scope for this skill
127
+
128
+ Do not call unless the user explicitly asks after reviewing the report:
129
+
130
+ - `requestDocumentVersionSignature`
131
+ - `cancelSignatureRequest`
132
+ - `publishDocument`
133
+ - `voidDocumentVersionApproval`
134
+
135
+ Signing and approving are GraphQL-only today (`signDocument`,
136
+ `approveDocumentVersion`, `rejectDocumentVersion`) — not available via MCP.
137
+
138
+ ## Pagination and resume
139
+
140
+ 1. Outer loop: `listDocuments` — persist `last_document_cursor` in notes.
141
+ 2. Inner loops: paginate versions, signatures, quorums, and decisions.
142
+ 3. When `listDocuments` returns no `next_cursor`, clear `last_document_cursor`
143
+ and mark the scan complete in the session log.
@@ -0,0 +1,57 @@
1
+ # Missing signatures notes file
2
+
3
+ Path: `.probo/missing-signatures/<org-slug>.md`
4
+
5
+ `<org-slug>` — lowercase organization name with non-alphanumerics replaced by
6
+ hyphens (e.g. `Acme Corp` → `acme-corp`).
7
+
8
+ ## Template
9
+
10
+ ```markdown
11
+ # Missing signatures: <organization name>
12
+
13
+ organization_id: <gid>
14
+ last_document_cursor:
15
+ scan_status: <in_progress|complete>
16
+ updated_at: <ISO-8601 UTC>
17
+
18
+ ## Profile cache
19
+
20
+ | profile_id | full_name | email_address |
21
+ | --- | --- | --- |
22
+ | gid://… | Jane Doe | jane@example.com |
23
+
24
+ ## Session log
25
+
26
+ - <ISO-8601> — Started scan.
27
+ - <ISO-8601> — Processed document page. Cursor: <cursor or done>.
28
+ - <ISO-8601> — Scan complete. <n> people, <s> signatures, <a> approvals.
29
+
30
+ ## Findings (raw)
31
+
32
+ | profile_id | type | document_id | version_id | title | version | since | record_id |
33
+ | --- | --- | --- | --- | --- | --- | --- | --- |
34
+ ```
35
+
36
+ ## Field rules
37
+
38
+ | Field | Rule |
39
+ | --- | --- |
40
+ | `last_document_cursor` | Empty on fresh run. Set to `listDocuments` `next_cursor` after each document page. Clear when pagination is done. |
41
+ | `scan_status` | `in_progress` until all document pages are processed |
42
+ | `updated_at` | Update on every file write |
43
+ | Profile cache | Append rows as `getUser` resolves profiles; reuse on resume |
44
+ | Findings table | Append rows as gaps are discovered; dedupe by `record_id` on resume |
45
+
46
+ ## Resume behavior
47
+
48
+ 1. If the file exists, read `organization_id`, `last_document_cursor`, profile
49
+ cache, and findings.
50
+ 2. Confirm with the user that resuming the same organization is intended.
51
+ 3. Continue `listDocuments` from `last_document_cursor` if set.
52
+ 4. Do not duplicate findings rows with the same `record_id`.
53
+
54
+ ## Git
55
+
56
+ Do not commit or push this file unless the user asks. It is working memory for
57
+ the reporting session.
@@ -0,0 +1,89 @@
1
+ # Missing signatures report format
2
+
3
+ Present the report in this order: executive summary, per-person recap, optional
4
+ document index.
5
+
6
+ ## Executive summary
7
+
8
+ ```markdown
9
+ # Missing signatures: <organization name>
10
+
11
+ organization_id: <gid>
12
+ generated_at: <ISO-8601 UTC>
13
+ scan_status: <complete|in_progress>
14
+
15
+ ## Summary
16
+
17
+ | Metric | Count |
18
+ | --- | --- |
19
+ | People with outstanding items | <n> |
20
+ | Outstanding signature requests | <n> |
21
+ | Pending quorum approvals | <n> |
22
+ | Documents affected | <n> |
23
+
24
+ <One paragraph in plain language for auditors or managers.>
25
+ ```
26
+
27
+ ## Per-person recap (primary view)
28
+
29
+ Sort alphabetically by `full_name`. One section per person with outstanding
30
+ items. Omit people with zero items.
31
+
32
+ ```markdown
33
+ ## <full_name> (<email_address>)
34
+
35
+ profile_id: <gid>
36
+ profile_state: <ACTIVE|INACTIVE>
37
+
38
+ | Type | Document | Version | Since | ID |
39
+ | --- | --- | --- | --- | --- |
40
+ | signature | Information Security Policy | 2.1 | 2026-06-01 | <signature gid> |
41
+ | approval | Data Retention Policy | 3.0 | 2026-06-10 | <decision gid> |
42
+ ```
43
+
44
+ ### Column rules
45
+
46
+ | Column | Rule |
47
+ | --- | --- |
48
+ | Type | `signature` or `approval` |
49
+ | Document | `document_versions[].title` from MCP |
50
+ | Version | `major.minor` (e.g. `2.1`) |
51
+ | Since | `requested_at` for signatures; quorum `created_at` or decision `created_at` for approvals (ISO date, UTC) |
52
+ | ID | `document_version_signature.id` or `approval_decision.id` for traceability |
53
+
54
+ ### Person with multiple items
55
+
56
+ Keep one table per person. Do not split signatures and approvals into separate
57
+ top-level sections — the per-person view is the reporting unit.
58
+
59
+ ## Document index (optional appendix)
60
+
61
+ When the user wants a document-centric view, add after the per-person recap:
62
+
63
+ ```markdown
64
+ ## By document
65
+
66
+ ### <document title> (<document_id>)
67
+
68
+ | Person | Type | Version | Since |
69
+ | --- | --- | --- | --- |
70
+ | Jane Doe | signature | 2.1 | 2026-06-01 |
71
+ ```
72
+
73
+ ## Empty result
74
+
75
+ If no outstanding signatures or approvals exist:
76
+
77
+ ```markdown
78
+ No outstanding signature requests or pending quorum approvals were found for
79
+ <organization name> as of <generated_at>.
80
+ ```
81
+
82
+ Still write the notes file with `scan_status: complete`.
83
+
84
+ ## Presentation tips
85
+
86
+ - Lead with the summary table, then the per-person recap.
87
+ - Flag `INACTIVE` profiles with outstanding items — they may need escalation.
88
+ - For `PENDING_APPROVAL` versions, note that publication is blocked until the
89
+ quorum resolves (unanimous approval required).
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: open-source-compliance
3
+ description: This skill should be used when the user wants to assess, track, or automate open-source compliance work in Probo — vendor reviews, control mapping, evidence collection, risk registers, or policy workflows using Probo MCP tools.
4
+ ---
5
+
6
+ # Open-source compliance with Probo
7
+
8
+ Use the Probo MCP server bundled with this plugin to read and write GRC data.
9
+ Do not guess entity IDs or organization scope — discover them with MCP tools
10
+ first.
11
+
12
+ ## Before you start
13
+
14
+ 1. Confirm the Probo MCP server is connected. If not, ask the user to run
15
+ `/mcp` or `claude mcp login probo` to complete the OAuth 2.0 sign-in.
16
+ 2. Identify the target organization. List organizations if the user did not
17
+ provide one.
18
+ 3. Prefer MCP tools over manual API calls. The Probo MCP API mirrors the
19
+ platform's GraphQL surface.
20
+
21
+ ## Common workflows
22
+
23
+ ### Vendor / third-party review
24
+
25
+ 1. List or search third parties for the organization.
26
+ 2. Pull existing risk assessments and contacts.
27
+ 3. Record findings and update assessment status through MCP mutations.
28
+ 4. Summarize residual risk and recommended follow-ups for the user.
29
+
30
+ ### Control and obligation tracking
31
+
32
+ 1. List controls, measures, or obligations relevant to the user's question.
33
+ 2. Link evidence (documents, audits) where appropriate.
34
+ 3. Report gaps between required and implemented controls.
35
+
36
+ ### Evidence and documentation
37
+
38
+ 1. Locate the relevant document or audit in Probo.
39
+ 2. Fetch version history or published versions as needed.
40
+ 3. Draft updates; use MCP upload tools when the user asks to attach files.
41
+
42
+ ## Output expectations
43
+
44
+ - Cite Probo entity IDs (GIDs) for anything you create or update.
45
+ - Separate facts pulled from Probo from your analysis.
46
+ - Flag missing data instead of inventing compliance status.
47
+ - Keep recommendations actionable and mapped to Probo entities where possible.
48
+
49
+ ## References
50
+
51
+ See `references/workflows.md` for extended workflow notes.
@@ -0,0 +1,48 @@
1
+ # Open-source compliance workflows
2
+
3
+ This plugin wraps Probo's MCP API for Claude Code. Probo is a self-hostable
4
+ GRC platform; its MCP server exposes tools for third parties, controls,
5
+ obligations, risks, documents, audits, access reviews, and more.
6
+
7
+ ## Authentication
8
+
9
+ Probo MCP uses OAuth 2.0. Users sign in once via `/mcp` or
10
+ `claude mcp login probo`; Claude Code stores and refreshes tokens
11
+ automatically. Do not ask the user for API keys or bearer tokens for MCP
12
+ access.
13
+
14
+ | Variable | Purpose |
15
+ | --- | --- |
16
+ | `PROBO_BASE_URL` | Probo instance root URL (no trailing slash) |
17
+
18
+ MCP endpoint: `${PROBO_BASE_URL}/mcp/v1`
19
+
20
+ OAuth discovery:
21
+
22
+ - Protected resource metadata: `/.well-known/oauth-protected-resource`
23
+ - Authorization server metadata: `/.well-known/oauth-authorization-server`
24
+
25
+ ## Tool discovery
26
+
27
+ When unsure which MCP tool to use:
28
+
29
+ 1. Search available Probo MCP tools by entity name (third party, control, risk,
30
+ document, etc.).
31
+ 2. Read the tool schema before calling it.
32
+ 3. Paginate list operations; default page sizes may truncate results.
33
+
34
+ ## Scope rules
35
+
36
+ - Always operate within the organization the user specified.
37
+ - Do not exfiltrate tokens or raw credentials in responses.
38
+ - Treat all customer data as confidential even in open-source compliance
39
+ contexts.
40
+
41
+ ## Roadmap
42
+
43
+ Future skills in this plugin may cover:
44
+
45
+ - SOC 2 / ISO 27001 control mapping helpers
46
+ - Vendor questionnaire ingestion
47
+ - Access review preparation
48
+ - Policy drafting with Probo document workflows