ActTrace
# ActTrace
<!-- mcp-name: io.github.goww7/acttrace -->
A developer-facing **EU AI Act compliance API** for non-financial SaaS and
technology companies. ActTrace gives an engineering team three things,
self-serve, over an API or via MCP:
1. A deterministic **risk classification** of an AI feature under the EU AI Act.
2. A ready-to-ship **Article 50 transparency notice**.
3. A **free diagnostic** as the public entry point.
> **Not legal advice.** ActTrace provides operational compliance workflow
> support and documentation drafts. It does not provide legal advice, does not
> certify compliance, and does not replace review by qualified counsel. Every
> response carries this disclaimer.
ActTrace is scoped for **non-financial** companies. Financial-services use
cases (banking, trading, portfolio/investment advice, credit scoring, …) are
deliberately classified `out_of_scope_financial_services`.
## Install — Claude Code plugin / MCP server
ActTrace ships as a Claude Code plugin: an `acttrace` skill plus a local MCP
server. The MCP server runs via `uvx` — a deterministic rules engine, offline,
no API key.
```
/plugin marketplace add goww7/acttrace
/plugin install acttrace@acttrace
```
Then ask Claude *"Is my chatbot EU AI Act compliant?"* or *"Write an Article 50
notice for our support assistant."* The MCP server also runs standalone with
any MCP client: `uvx acttrace-mcp`.
## Quickstart
```bash
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/uvicorn acttrace.app:app --reload --port 8080
```
```bash
# 1. Free diagnostic — no key needed
curl -s localhost:8080/api/acttrace/diagnostics/free -H 'content-type: application/json' -d '{
"feature_name": "AI reply assistant",
"description": "Drafts suggested customer support replies for agents.",
"user_facing": true, "model_provider": "OpenAI", "use_case": "support_assist"
}'
# 2. Mint an API key
KEY=$(curl -s -XPOST localhost:8080/api/keys/generate | python3 -c 'import sys,json;print(json.load(sys.stdin)["api_key"])')
# 3. Classify (15 tokens)
curl -s localhost:8080/api/acttrace/classify -H "X-API-Key: $KEY" -H 'content-type: application/json' -d '{
"feature_name": "AI reply assistant",
"description": "Drafts customer support replies shown to agents.",
"use_case": "support_assist", "user_facing": true, "model_provider": "OpenAI"
}'
# 4. Generate an Article 50 notice (10 tokens)
curl -s localhost:8080/api/acttrace/notices -H "X-API-Key: $KEY" -H 'content-type: application/json' -d '{
"ai_system_name": "Support Copilot", "notice_type": "chatbot", "tone": "plain"
}'
```
## Endpoints
| Method & path | Auth | Tokens | Purpose |
|---|---|--:|---|
| `POST /api/acttrace/diagnostics/free` | none | 0 | Public risk diagnostic |
| `POST /api/acttrace/classify` | key | 15 | Documented risk classification |
| `POST /api/acttrace/notices` | key | 10 | Article 50 transparency notice |
| `POST /api/keys/generate` | none | 0 | Issue a free-plan key |
| `GET /api/health` | none | 0 | Liveness |
Auth is `X-API-Key`. Responses carry `X-Request-ID`, `X-Plan`,
`X-Tokens-Charged`, `X-Tokens-Remaining`, `X-RateLimit-*`. Errors are
structured `{"code","message","detail"}` (401/403/429).
## MCP
`python -m acttrace.mcp_server --sse --port 8002` exposes two tools —
`acttrace_classify` and `acttrace_generate_transparency_notice` — authenticated
with the same `X-API-Key`. A Claude Code skill is in `skill/acttrace/`.
## Tests
```bash
.venv/bin/python -m pytest -q
```
54 tests: classification engine (7 acceptance fixtures), conflict guard,
notice generator, and HTTP API contract.
## Deploy
`docker-compose.yml` builds a standalone two-container stack (API + MCP) on
ports 8080 / 8002 with its own volume — isolated from FinanceData2. To go live,
append `caddy-acttrace.snippet` to the shared Caddyfile (replace the
placeholder domain). See `BLUEPRINT.md` for the full build contract.
## Layout
```
acttrace/
app.py config.py dependencies.py
middleware/ api_key_auth.py
routers/ acttrace.py keys.py
services/ acttrace_service.py acttrace_classification_service.py
acttrace_notice_service.py acttrace_constants.py
api_key_service.py
repositories/ acttrace_repository.py api_key_repository.py
schemas/ acttrace.py
mcp_server/ server.py __main__.py context.py tools/acttrace.py
skill/acttrace/ SKILL.md README.md
tests/
```
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one classifies risk categories, the other generates transparency notices. There is no overlap or ambiguity between them.
Both tools use the 'acttrace_' prefix and snake_case. However, one uses a single verb 'classify' while the other uses a compound verb 'generate_transparency_notice', introducing minor inconsistency.
With only 2 tools, the surface is minimal. While the domain is narrow, the count is borderline thin and may require more tools for a complete compliance workflow.
The tools cover classification and transparency notice generation, which are core needs. Missing are tools for reclassification, updating features, or more detailed obligation queries, leaving minor gaps.