Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,14 @@ jobs:
- name: Install MkDocs Material
run: pip install mkdocs-material mkdocs-swagger-ui-tag

# packages/mcp is a Python client of the API, and this job already has Python. Its test pins
# the read-only tool surface against the committed OpenAPI snapshot (which the .NET job pins
# against the served document), so a write endpoint cannot leak into the MCP tool set unnoticed.
- name: Test the MCP server package
run: |
pip install "fastmcp>=3.4,<4" pytest
pytest packages/mcp -q
Comment on lines 177 to +186

- name: Build the docs site
working-directory: docs-site
run: mkdocs build --strict
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,8 @@ PublishScripts/
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# ...but /packages/* at the repo root is our MIT client code (packages/mcp), not NuGet restore output.
!/packages/**
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ descriptions are **document** versions, produced by the versioning engine. They

### Added

- **easydocs can be used from AI coding agents.** `packages/mcp/easydocs_mcp.py` is a read-only
[MCP](https://modelcontextprotocol.io) server generated from the install's own `/openapi/v1.json`:
seventeen tools covering documents, history, redlines, audit trails, approvals and folders, for
Claude Code, Cursor, Codex, Gemini CLI and Claude Desktop. It runs on the user's machine with their
own `ed_` token, so every call is authorized exactly as their `curl` would be. Nothing on the
server changed. `packages/*` is now real and MIT-licensed, as the licence section always said it
would be.
- **Merging a branch now goes through a review.** The history's merge control opens a screen showing
the version both branches forked from, what each side changed since that fork, and a hint naming the
paragraphs both authors touched — so the decision is made with the other side's work visible, rather
Expand Down
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ By making a contribution to this project, I certify that:

## Licensing

- **Everything in this repository today is AGPL-3.0.**
- Future API clients / SDKs under `packages/*` will be **MIT** — but there is no `packages/` directory
yet, so nothing here is MIT-licensed at the moment.
- **Everything in this repository is AGPL-3.0, except `packages/*`.**
- `packages/*` holds API clients and is **MIT** — today that is `packages/mcp`, the MCP server. Each
package carries its own `LICENSE`.

By contributing, you agree your contribution is licensed under the license of the directory it lands in.
The full reasoning and the exact boundary are in the
Expand Down
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ Everything the UI does, the API does — it is the same surface, not a subset.
- **Auth:** `ed_`-prefixed personal access tokens as `Authorization: Bearer ed_…`, or the session cookie
for the browser. A token can never exceed the role of the user who minted it.
- **Live updates:** server-sent events per document at `/api/v1/documents/{id}/events`.
- **MCP:** a read-only [MCP server](packages/mcp/) for Claude Code, Cursor and other AI coding agents,
generated from the OpenAPI document — install with one command, runs on your machine as you.

Worked end-to-end examples: [automation recipes](https://aptsny.github.io/easydocs/automation-recipes/).

Expand Down Expand Up @@ -198,18 +200,17 @@ way it started: people who need it, keeping it alive.

## License

**Everything in this repository today is AGPL-3.0** ([LICENSE](LICENSE)) — server, SPA, tests, deploy
files, docs.
**Everything in this repository is AGPL-3.0** ([LICENSE](LICENSE)) — server, SPA, tests, deploy
files, docs — except `packages/*`, which is MIT.

| Path | License |
|---|---|
| Everything in this repo | **AGPL-3.0** — the whole repository right now |
| `packages/*` — future API client SDKs | **MIT**, when written. The directory does not exist yet. |
| Everything outside `packages/*` | **AGPL-3.0** |
| `packages/*` — API clients | **MIT.** Today: [`packages/mcp`](packages/mcp/), the MCP server. |

AGPL is the right licence for a self-hostable server — it keeps modifications to a *hosted* easydocs
available to its users. It is the wrong licence for a thin client library, so future SDKs will live
under `packages/*` with their own MIT `LICENSE`. **Until that directory exists, assume AGPL-3.0 for
anything you take from here.** Full reasoning:
available to its users. It is the wrong licence for a thin client library, so clients live
under `packages/*` with their own MIT `LICENSE`. **Anything outside that directory is AGPL-3.0.** Full reasoning:
[spec §14](docs/superpowers/specs/2026-07-24-easydocs-v1-design.md).

Contributions are under the **Developer Certificate of Origin** — sign off every commit with
Expand Down
4 changes: 4 additions & 0 deletions docs-site/docs/automation-recipes.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,10 @@ or an Editor of the document may revoke.

## Other useful calls

Prefer talking to an AI agent instead of `curl`? The [MCP server](https://github.com/AptsNY/easydocs/tree/main/packages/mcp)
exposes the read side of this API — every `GET` below — as tools for Claude Code, Cursor and friends,
authenticated with the same `ed_` token.

```bash
# Who am I, and which org is this session bound to?
curl -sS -H "$AUTH" "$BASE/api/v1/me"
Expand Down
8 changes: 4 additions & 4 deletions docs/architecture-decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,19 +208,19 @@ trusting. Conformance criteria (E1–E12) encode the spec's promises as executab
**Consequences.** Green means the artifact users pull works, on both architectures. Trade:
negative guards age — two of them had to learn that v1.1 legitimately ships WebDAV.

## ADR-13: AGPL server, MIT SDKs (when they exist)
## ADR-13: AGPL server, MIT clients under `packages/*`

**Context.** A self-hostable server wants copyleft (improvements to *hosted* instances must flow
back); client libraries want the opposite (copyleft on an SDK punishes the API's own users).

**Decision.** Everything in the repository is AGPL-3.0. Future client SDKs will live under
`packages/*` with their own MIT license — a directory boundary you can point at. Until that
directory exists, nothing here is MIT. Contributions are DCO (`git commit -s`), no CLA;
`packages/*` with their own MIT license — a directory boundary you can point at. The first occupant
is `packages/mcp`, the MCP server (2026-08). Contributions are DCO (`git commit -s`), no CLA;
contributors keep their copyright.

**Consequences.** A company can run, modify, and even sell hosted easydocs — as long as its users
get the source of what's actually serving them. Integrating with the API from proprietary code is
explicitly intended and will be MIT-smooth once SDKs exist.
explicitly intended and is MIT where the client code lives.

---

Expand Down
Loading
Loading