TL;DR: faf-python-sdk v2 returns the kernel's score in pure Python, and mcpaas.live v1.8 scores every hosted route with the kernel. Python apps and the edge now give your file the same number as faf-cli. Upgrading? Run faf auto once and your score is back.

In Plain English

Old state. The Python SDK and the hosted server each had their own scorer. On 80 FAF repos, the hosted one matched always-33 on only 47.

Fix. Python matches the kernel file for file, and the edge runs the kernel itself. Slots that are not applicable to a project are marked slotignored, and do not score.

New state. The same score in Python, on the hosted MCP routes, on README badges, and in every other FAF tool.

Python:

pip install faf-python-sdk

The edge: point an MCP client at a hosted route, with nothing to install:

https://mcpaas.live/claude/mcp/v1 https://mcpaas.live/grok/mcp/v1

Or uv add faf-python-sdk. On claude.ai, add the Claude route as a custom connector (Settings → Connectors, no sign-in), as in Part II.

Where this fits

This is Part V of the Always33 series. Part I was faf-cli v8, where the engine was authored. Then claude-faf-mcp v7, faf-mcp v4 and gemini-faf-mcp v3 and grok-faf-mcp v2. Part V takes the same number past JavaScript and off your machine. The overview is The Always33 Suite.

faf-python-sdk v2

The kernel's number, in pure Python. score_faf(yaml) returns what faf-kernel returns, on every file. A parity test checks the score, tier, counts and every slot state against the kernel's own answers: 845 of 845 files match, from real project.faf files to deliberately awkward YAML.

from faf_sdk import score_faf result = score_faf(open("project.faf").read()) print(result.score, result.tier)
  • Always 33 slots. A file with the 21 base slots filled and no markers scores 64%. The same file plus the 12 slotignored markers scores 100%.
  • It never raises. Unreadable YAML scores 0 with every slot empty, for any str or bytes input.
  • Breaking changes are listed. Slot names follow the kernel (stack.framework, not stack.frontend), tier= no longer changes the slot count, tbd and todo count as empty, and rounding is half away from zero. The CHANGELOG has the full list.

mcpaas.live v1.8

The kernel, at the edge. The hosted MCP routes (/claude/mcp, /grok/mcp, /faf/mcp) score with the same kernel as faf-cli, claude-faf-mcp and faf-mcp. So do the README score badges, the repo cards and the GitHub pages. Checked live after deploy: the same numbers on all three routes.

Seven patches followed in two days. The ones you can see:

  • faf_validate gives the same answer as faf_score.
  • Trophy is ✪ on tool output, and the Trophy mark draws on badges and cards.
  • Files from GitHub are read as UTF-8, so a ✪ or an em dash no longer breaks a score.
  • /health and /info name the engine that scores.
  • Souls are never scored. A soul is a personal record, not project context, so it gets no score, percentage or tier.

Upgrading: run faf auto once

A .faf without the 12 enterprise markers now counts them as empty in Python and at the edge: 21 filled is 64%. Run faf auto (faf-cli) and the score returns. If you gate on score_faf or a badge, re-check the threshold.

Try it

pip install faf-python-sdk

Or at the edge: add https://mcpaas.live/claude/mcp/v1 to claude.ai, or the Grok route to ~/.grok/config.toml, and ask for faf_score.

More depth: The Always33 Suite · faf-python-sdk CHANGELOG · mcpaas.live.

Technical details

  • faf-python-sdk: 2.0.0 (September 28, 2026) · PyPI · pure Python · 845/845 kernel parity
  • mcpaas.live: 1.8.0 to 1.8.7 (September 27 to 28, 2026) · Cloudflare edge · hosted MCP routes for Claude, Grok and IDEs · badges and repo cards
  • Edition: The Always33 Edition
  • Scoring: the always-33 engine; 21 slots filled, the 12 enterprise slots slotignored