
Company News
AWS Security Hub Adds Socket for Supply Chain Security
Socket is now in the AWS Security Hub Extended plan. Adopt it through AWS, apply committed spend, and block malicious open source packages.
rosentic-mcp
Advanced tools
MCP server for Rosentic - cross-branch conflict detection for parallel AI coding agents: catches breaking signature changes, HTTP route breaks, and schema drift between agent branches before merge
CI checks each PR against main. It doesn't check open PRs against each other.
Rosentic does. Install one package, then ask your coding agent to check for cross-branch conflicts before you merge.
One agent changes a function signature. Another agent still calls the old version. Both pass CI. Git merges the text cleanly. Main breaks.
Rosentic compares active branches against each other. Deterministic static analysis across 13 languages (Python, JavaScript, TypeScript, Go, Java, Rust, Swift, C++, Kotlin, C#, Ruby, PHP, Dart). No LLM. In local MCP mode, code and scan metadata stay on your machine.
MCP gives your editor or coding agent access to Rosentic tools on demand. It is not a hard automatic gate by itself: a CLAUDE.md instruction is advisory, and an agent can forget or ignore it. For a gate that BLOCKS, run rosentic-mcp install-hooks and commit the result (see Enforce below), or use the GitHub Action as a CI backstop.
CACHED.check_file marks sibling-branch index data stale after 300 seconds
(stale_after_seconds to override). Stale, skipped, moved, or newly
unindexed sibling coverage is DEGRADED, never SAFE by implication.git fetch to pick
up new sibling work; the server never fetches for you.check_file, check_conflicts, explain_conflict,
list_branches, run_status, and which_lane are fully local and work
with no network. get_policy, get_verdict, and get_remediation_queue
read the dashboard API and degrade gracefully offline -
they return an explanatory payload (never raise), and get_policy
reports the built-in default (advisory, UNSAFE fails), which is exactly
what the CI gate falls back to.NOT_EXECUTED
instead of incorrectly reporting branches as absent.~/.rosentic/mcp-usage.json.
Nothing is billed and the counter never blocks a call.Every answer names whether its check was EXECUTED, served from a validated
CACHED result, DEGRADED, or NOT_EXECUTED. A degraded answer says in its
model-facing message that it is not a clear result; nested metadata is evidence,
not the only warning.
pip3 install --upgrade rosentic-mcp
Use --upgrade even on a machine that already has the package: a plain pip install is a no-op for returning users and silently keeps stale code. If pip3 is not on PATH, use python3 -m pip install --upgrade rosentic-mcp.
Add to ~/.claude.json:
{
"mcpServers": {
"rosentic": {
"command": "rosentic-mcp"
}
}
}
Add this instruction to your repo's CLAUDE.md:
Before running git push, call the Rosentic check_conflicts MCP tool to verify your branch is compatible with other active branches.
Add to ~/.codex/config.toml:
[mcp_servers.rosentic]
command = "rosentic-mcp"
args = []
Add the same push-boundary instruction to AGENTS.md.
Add to MCP settings:
{
"rosentic": {
"command": "rosentic-mcp"
}
}
The steps above give agents the tools and an instruction. Nothing yet blocks a bad push. One command installs the committed enforcement path:
cd your-repo
rosentic-mcp install-hooks
git add .githooks .claude/settings.json
git commit -m "Add Rosentic enforcement gate"
What it installs:
.githooks/pre-push - a committed git hook that runs rosentic-mcp gate and exits nonzero on UNSAFE findings. The gate fails closed: if the scan cannot run, the push is blocked with an explanation. Bypass one push with ROSENTIC_SKIP=1 git push; make WARNING findings block too with ROSENTIC_STRICT=1.git config core.hooksPath .githooks - the per-clone wiring. git config cannot be committed, so each fresh clone runs rosentic-mcp install-hooks once (it is idempotent)..claude/settings.json - committed Claude Code hooks: PreToolUse blocks an UNSAFE write before it lands, and Stop keeps the agent working while UNSAFE cross-branch findings exist. Because this file is committed, every fresh clone gates Claude Code sessions immediately, with zero per-user setup. If the file already exists, install-hooks appends the Rosentic entries and never removes yours.You can also run the gate directly, in CI or by hand:
rosentic-mcp gate --repo . --base main # exit 0 clean, 1 UNSAFE, 2 scan error
The rosentic-mcp 0.2.2 local server exposes all nine tools below. Six answer
from the checkout and work offline; the three dashboard lookups are API-backed
and report degradation explicitly when the network is unavailable.
| Tool | Local answer |
|---|---|
check_file | Checks proposed file content against sibling branches. |
check_conflicts | Scans active branches for deterministic compatibility conflicts. |
explain_conflict | Explains one finding from a recent scan. |
list_branches | Lists local branches by last commit. |
run_status | Reads manifest lanes, local heads, merge state, sequence, and landing readiness. |
which_lane | Resolves declared path ownership without guessing. |
get_verdict | Reads a recorded gate verdict for a checkout and SHA. |
get_policy | Reads the effective merge-gate policy. |
get_remediation_queue | Reads the ranked remediation queue. |
check_conflictsScan a git repo for cross-branch conflicts affecting your current branch.
Parameters:
repo_path (required) - path to local git repositorybranch - branch to check (defaults to current branch)base - base branch to compare against (defaults to main)format - "summary" (natural language) or "json" (structured findings)Every response carries a discrete execution_status and model-facing message.
Summary responses put the unchanged prose under summary; JSON responses put
structured findings under findings. An empty result is meaningful only when
the status is EXECUTED or CACHED.
Example response:
Rosentic found 4 unique conflict(s) for feature/auth-refactor: 2 UNSAFE, 2 WARNING. Layer breakdown: 3 L1 signature, 1 L2 route. Most critical: createUser() in src/auth/users.ts - changed from 2 to 3 required params. Recommendation: inspect the UNSAFE findings first and update the stale branch before merging.
check_fileCheck proposed complete file content against active sibling branches before writing.
Parameters:
repo_path (required) - path to local git repositoryfile (required) - repository-relative file path being editedcontent (required) - proposed complete post-edit file contentbranch - current branch to use as the proposed-content overlaybase - base branch to compare against (defaults to main)stale_after_seconds - mark branch index data stale after this many secondsThe response includes SAFE/WARNING/UNSAFE verdict, conflict direction, consumers with branch attribution, checked branches, skipped branches with reasons, and index freshness metadata.
explain_conflictGet detailed explanation of a specific finding, including affected branches, consumer locations, and remediation steps.
The prose is returned under summary beside execution_status and message.
Parameters:
repo_path (required) - path to local git repositoryfinding_id (required) - ID from a previous check_conflicts resultlist_branchesList local branches sorted by most recent commit date. The rows are returned
under branches beside the common execution status and message.
Parameters:
repo_path (required) - path to local git repositoryrun_statusRead .rosentic/run.yaml plus local Git branch heads and merge state. Returns
each lane's sequence position, whether it is merged into the manifest's base
branch, the lane currently clear to land, and old branches still ahead of
base. Checkout state is current by definition, so the Remote-only
RESCAN_REQUIRED staleness case does not apply here.
Parameters:
repo (required) - path to local git repositorycursor - pagination cursor from a prior responselimit - number of lanes to return (default 25, maximum 100)which_laneMatch repository-relative paths against the manifest's declared
protected_paths. Missing or ambiguous ownership is returned explicitly;
the tool never guesses.
Parameters:
repo (required) - path to local git repositorypaths (required) - one to 100 repository-relative pathsget_verdictLook up recorded gate verdicts in the Rosentic audit ledger by SHA (append-only gate ledger via the dashboard API). Requires ROSENTIC_API_KEY (a ros_live_ workspace key) for the org's workspace. Degrades gracefully offline - returns an explanatory payload instead of raising.
Parameters:
repo (required) - path to local git repositorysha (required) - branch head SHA to look upget_policyFetch the effective Rosentic gate policy (repo > org default > built-in): gate mode, severity threshold, per-layer enforce/advisory, branch-pattern rules, and the stamped policy version. Public read - no key needed. Degrades gracefully offline with the built-in default and a notice.
Parameters:
org (required) - GitHub org/owner of the repositoryrepo - repository name; omit for the org default policyOn developer machines an MCP entry often points at a source checkout rather than an installed rosentic-mcp. A checkout follows whatever branch is checked out, so the engine behind your results moves every time you switch branches, and nothing about the output looks different.
The server keys this off the process actually answering, not off what any config entry is named. When the answering server is a checkout, or the engine resolved to something other than an explicit path or an installed package, the first tool result per repo opens with ROSENTIC ENGINE SOURCE UNEXPECTED, naming the checkout root, commit, and branch. The same condition appears on every result as engine_source.unexpected.
Renaming an entry does not change this either way: an entry called rosentic-dev is not itself a problem, and renaming one will not silence a checkout that is genuinely answering.
Ask directly at any time:
rosentic-mcp doctor # which server answered, which engine, and whether that is supported
rosentic-mcp doctor --json # same, machine readable; exits 1 when unsupported
Remedy, once doctor shows a checkout is answering:
claude mcp list # find the entry that launches the checkout
claude mcp remove <that-entry-name> -s user
claude mcp add rosentic -s user -- uvx --from rosentic-mcp rosentic-mcp
Then restart the MCP client so the old server process is replaced, and re-run rosentic-mcp doctor.
| Layer | What | Example |
|---|---|---|
| L1 | Function signature mismatches | Branch A adds required param, Branch B still calls with old arity |
| L2 | HTTP route contract breaks | Route path or method changes, consumers still call old endpoint |
| L3 | Schema incompatibilities | Proto field removed, GraphQL type changed, OpenAPI contract broken |
From a checkout that has this repository's helper scripts:
python3 scripts/mcp-smoke-test.py
Expected output:
Rosentic MCP OK: check_conflicts, check_file, explain_conflict, get_policy, get_remediation_queue, get_verdict, list_branches, run_status, which_lane
FAQs
MCP server for Rosentic - cross-branch conflict detection for parallel AI coding agents: catches breaking signature changes, HTTP route breaks, and schema drift between agent branches before merge
We found that rosentic-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket is now in the AWS Security Hub Extended plan. Adopt it through AWS, apply committed spend, and block malicious open source packages.

Research
/Security News
Popular npm packages keyv and cacheable compromised.

Security News
A misconfiguration gave three Anthropic models internet access, and one, believing it was in a simulation, shipped a credential-stealing package to PyPI.