Create and update Business Model Canvas data in strategy.* — business units, the 9 canvas
blocks, typed business-unit relationships, assumptions, provenance sources, draft canvas
snapshots, competitors and personas.
List strategy.business_units. Excludes archived rows unless include_archived: true. Optionally filter to children of a parent via parent_business_unit_id.
get_business_unit
Fetch one business unit by id.
create_business_unit
Create a business unit — the root entity every canvas block hangs off of.
update_business_unit
Partially update a business unit by id.
archive_business_unit
Set is_archived (default true; pass archived: false to unarchive). Soft flag only — child rows are untouched.
Upsert a row into one of the 9 BMC block tables (value_proposition, customer_segment, customer_relationship, channel, revenue_stream, key_partner, key_activity, key_resource, expense_category) for a business_unit_id. Pass id to update, omit to insert. fields maps straight to the target table’s columns — key_partner and key_resource (resources table) accept free-text name (+ description for key_resource), added 2026-07-15 via dfl-schema #683 to fix the “Unnamed Partner” display bug.
Create a typed edge in strategy.business_unit_relationships between two business units (from_bu → to_bu), e.g. “funds”, “commercializes”, “supplies_talent”.
Record a strategy.sources row — where a piece of strategy data came from (a Fireflies call, a plans.devfellowship.com plan, a Company Brain node, or a manual note).
link_artifact_source
Link any strategy.* artifact row (by table + id) to a source created via add_source.
Assemble a business unit’s full canvas (business unit + all 9 blocks + active relationships + assumptions) into a strategy.canvas_snapshots row, status: "draft". Version auto-increments per business unit.
List strategy.writing_patterns rows for a business_unit_id, ordered by sort_order. Optionally narrow to one slot. Each row is a “voice slot” — a reusable definition of how a given surface should sound.
upsert_writing_pattern
Create or update one voice slot. Pass id to update that exact row, or slot to update-or-insert by slot. pattern is free-form jsonb and replaces the stored object (no deep merge).
List strategy.keywords (the SEO keyword corpus) of one business_unit_id. count is the exact corpus size of that BU, independent of limit.
delete_keywords
Hard-delete keywords by id, scoped to one business_unit_id. Metrics and relations cascade. Returns deleted_ids and not_deleted_ids. The cleanup path for e2e specs, which delete every keyword they create.
upsert_keywords
Create keywords in one business_unit_id (up to 200 per call), each with optional cluster_name / cluster_color, a keyword_metrics snapshot, and a parent_text for the mind-map tree. Identity is (business_unit_id, slug) with the campaigns app slugifier. Existing keywords are reused and left unchanged unless update_existing is true. Idempotent: re-run the same batch after a partial failure.
Every tool on this page authenticates with the caller’s Supabase user JWT (RLS-scoped). None of them
use service_role, per the fleet-wide rule that MCP tools carry the calling user’s own privileges —
writes are exactly as permitted (or blocked) by the RLS policies above.