Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
ecbce07
feat: distributed notification queue for background task elicitation
gfortaine Feb 8, 2026
5dafe19
fix: store progress in Redis and use BLPOP for elicitation
gfortaine Feb 8, 2026
1f84e50
test: rewrite as integration tests with zero mocks
gfortaine Feb 8, 2026
3d665d4
fix: stabilize task notification integration tests
gfortaine Feb 8, 2026
dfb857a
Scope Martian triage to bug-labeled issues for jlowin (#3124)
jlowin Feb 9, 2026
45af482
Add Azure OBO dependencies, auth token injection, and documentation (…
jlowin Feb 10, 2026
939cf5f
feat: add Static Client Registration (#3085) (#3086)
martimfasantos Feb 10, 2026
5bab188
Add concurrent tool execution with sequential flag (#3022)
strawgate Feb 10, 2026
81a7c83
CI: Commit generated artifacts back to PR branch instead of opening s…
jlowin Feb 10, 2026
a1cf2af
chore: Update SDK documentation (#3116)
marvin-context-protocol[bot] Feb 10, 2026
eeb1785
docs: add pre-registered OAuth clients to v3-features (#3129)
jlowin Feb 10, 2026
cdad995
Fix Windows test timeouts in OAuth proxy provider tests (#3123)
strawgate Feb 10, 2026
f7c47f4
Merge branch 'main' into fix/statusMessage-not-forwarded
chrisguidry Feb 10, 2026
40e80d6
Fix session visibility marks leaking across sessions (#3132)
jlowin Feb 10, 2026
a715176
Fix unhandled exceptions in OpenAPI POST tool calls (#3133)
jlowin Feb 10, 2026
1d0c0ad
Add validate_output option for OpenAPI tools (#3134)
jlowin Feb 10, 2026
3809f0c
Merge branch 'main' into fix/statusMessage-not-forwarded
chrisguidry Feb 10, 2026
361eb08
Relay task elicitation through standard MCP protocol
chrisguidry Feb 10, 2026
95816c5
Merge pull request #2906 from gfortaine/fix/statusMessage-not-forwarded
chrisguidry Feb 10, 2026
aa4db3d
Address review: set status key on cancel fallback, prevent relay task GC
chrisguidry Feb 10, 2026
95b4271
chore: Update SDK documentation
marvin-context-protocol[bot] Feb 10, 2026
a95fed3
Merge branch 'main' into task-elicitation-relay
chrisguidry Feb 10, 2026
6e22914
Move relay logic to elicitation.py, fix related-task metadata key
chrisguidry Feb 10, 2026
a53030a
chore: Update SDK documentation
marvin-context-protocol[bot] Feb 10, 2026
efcc12b
Merge pull request #3136 from jlowin/task-elicitation-relay
chrisguidry Feb 10, 2026
8e1f662
Bump py-key-value-aio to >=0.4.0,<0.5.0 (#3143)
strawgate Feb 11, 2026
f3d33f8
docs: add v3.0.0rc1 section to v3-features tracking (#3145)
jlowin Feb 11, 2026
3e79572
docs: remove nonexistent MSALApp from rc1 notes (#3146)
jlowin Feb 11, 2026
f75cd05
chore(deps): bump cryptography (#3140)
dependabot[bot] Feb 11, 2026
263e0bf
fix: snapshot access token for background tasks (#3095) (#3138)
gfortaine Feb 11, 2026
0f95ed7
Stop duplicating path parameter descriptions into tool prose (#3149)
jlowin Feb 11, 2026
25e2f4d
Remove deprecated FastMCP() constructor kwargs (#3148)
jlowin Feb 11, 2026
50b2329
Support async auth checks (#3152)
jlowin Feb 11, 2026
fe57c3d
Make $ref dereferencing optional via FastMCP(dereference_refs=...) (#…
jlowin Feb 11, 2026
b3b630e
Updates to github actions / workflows for claude
strawgate Feb 11, 2026
c9fbd1f
Merge origin/main into update-claude-workflows
strawgate Feb 11, 2026
b42f6f9
update conditionals
strawgate Feb 11, 2026
16a85ff
pretty yaml
strawgate Feb 11, 2026
a307e9c
Expose local_provider property, deprecate FastMCP.remove_tool() (#3155)
jlowin Feb 12, 2026
359575b
Add helpers for converting FunctionTool and TransformedTool to Sampli…
strawgate Feb 12, 2026
175479f
fix: guard client pagination loops against misbehaving servers (#3167)
jlowin Feb 12, 2026
3907a4f
docs: fix stale get_* references, now list_* (#3168)
jlowin Feb 12, 2026
88c8924
Merge pull request #3157 from jlowin/update-claude-workflows
jlowin Feb 12, 2026
b62ed34
Support non-serializable values in Context.set_state (#3171)
jlowin Feb 12, 2026
5f941be
Fix stale request context in StatefulProxyClient handlers (#3172)
jlowin Feb 12, 2026
e555317
docs: update all references from 3.0.0b2 to 3.0.0rc1 (#3173)
jlowin Feb 12, 2026
bb60287
chore(deps): bump cryptography in the uv group across 1 directory (#3…
dependabot[bot] Feb 13, 2026
ccfe504
Fix include_tags/exclude_tags ignored without tools in MCPConfig (#3186)
jlowin Feb 14, 2026
ccb74da
Merge origin/main into feature/apps
jlowin Feb 14, 2026
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
95 changes: 95 additions & 0 deletions .github/actions/run-claude/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Composite Action for running Claude Code Action
#
# Wraps anthropics/claude-code-action with MCP server configuration.
# Template based on elastic/ai-github-actions base action.
#
# Usage:
# - uses: ./.github/actions/run-claude
# with:
# prompt: "Your prompt here"
# claude-oauth-token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# github-token: ${{ steps.marvin-token.outputs.token }}
# allowed-tools: "Edit,Read,Write,Bash(*),mcp__github__add_issue_comment"
#
name: "Run Claude"
description: "Run Claude Code with MCP servers"
author: "FastMCP"

branding:
icon: "cpu"
color: "orange"

inputs:
prompt:
description: "Prompt to pass to Claude"
required: true

claude-oauth-token:
description: "Claude Code OAuth token for authentication"
required: true

github-token:
description: "GitHub token for Claude to operate with"
required: true

allowed-tools:
description: "Comma-separated list of allowed tools (e.g. Edit,Write,Bash(npm test))"
required: false
default: ""

model:
description: "Model to use for Claude"
required: false
default: "claude-opus-4-6"

allowed-bots:
description: "Allowed bot usernames, or '*' for all bots"
required: false
default: ""

track-progress:
description: "Whether Claude should track progress"
required: false
default: "true"

mcp-servers:
description: "MCP server configuration JSON"
required: false
default: '{"mcpServers":{"agents-md-generator":{"type":"http","url":"https://agents-md-generator.fastmcp.app/mcp"},"public-code-search":{"type":"http","url":"https://public-code-search.fastmcp.app/mcp"}}}'

trigger-phrase:
description: "Trigger phrase (for mention workflows)"
required: false
default: "/marvin"

outputs:
conclusion:
description: "The conclusion of the Claude Code run"
value: ${{ steps.claude.outputs.conclusion }}

runs:
using: "composite"
steps:
- name: Clean up stale Claude locks
shell: bash
run: rm -rf ~/.claude/.locks ~/.local/state/claude/locks || true

- name: Run Claude Code
id: claude
env:
GITHUB_TOKEN: ${{ inputs.github-token }}
uses: anthropics/claude-code-action@v1
with:
github_token: ${{ inputs.github-token }}
claude_code_oauth_token: ${{ inputs.claude-oauth-token }}
bot_name: "Marvin Context Protocol"
trigger_phrase: ${{ inputs.trigger-phrase }}
allowed_bots: ${{ inputs.allowed-bots }}
track_progress: ${{ inputs.track-progress }}
prompt: ${{ inputs.prompt }}
claude_args: |
${{ (inputs.allowed-tools != '' || inputs.extra-allowed-tools != '') && format('--allowedTools {0}{1}', inputs.allowed-tools, inputs.extra-allowed-tools != '' && format(',{0}', inputs.extra-allowed-tools) || '') || '' }}
${{ inputs.mcp-servers != '' && format('--mcp-config ''{0}''', inputs.mcp-servers) || '' }}
--model ${{ inputs.model }}
settings: |
{"model": "${{ inputs.model }}"}
62 changes: 62 additions & 0 deletions .github/scripts/mention/gh-get-review-threads.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/usr/bin/env bash
set -euo pipefail

# Get PR review threads with comments via GitHub GraphQL API
#
# Usage:
# gh-get-review-threads.sh [FILTER]
#
# Arguments:
# FILTER - Optional: filter for unresolved threads from specific author
#
# Environment (set by composite action):
# MENTION_REPO - Repository (owner/repo format)
# MENTION_PR_NUMBER - Pull request number
# GITHUB_TOKEN - GitHub API token
#
# Output:
# JSON array of review threads with nested comments

# Parse OWNER and REPO from MENTION_REPO
REPO_FULL="${MENTION_REPO:?MENTION_REPO environment variable is required}"
OWNER="${REPO_FULL%/*}"
REPO="${REPO_FULL#*/}"
PR_NUMBER="${MENTION_PR_NUMBER:?MENTION_PR_NUMBER environment variable is required}"
FILTER="${1:-}"

gh api graphql -f query='
query($owner: String!, $repo: String!, $prNumber: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $prNumber) {
reviewThreads(first: 100) {
nodes {
id
isResolved
isOutdated
path
line
comments(first: 50) {
nodes {
id
body
author { login }
createdAt
}
}
}
}
}
}
}' -F owner="$OWNER" \
-F repo="$REPO" \
-F prNumber="$PR_NUMBER" \
--jq '.data.repository.pullRequest.reviewThreads.nodes' | \
if [ -n "$FILTER" ]; then
jq --arg author "$FILTER" '
map(select(
.isResolved == false and
.comments.nodes | any(.author.login == $author)
))'
else
cat
fi
61 changes: 61 additions & 0 deletions .github/scripts/mention/gh-resolve-review-thread.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
set -euo pipefail

# Resolve a GitHub PR review thread, optionally posting a comment first
#
# Usage:
# gh-resolve-review-thread.sh THREAD_ID [COMMENT]
#
# Arguments:
# THREAD_ID - The GraphQL node ID of the review thread to resolve
# COMMENT - Optional: Comment body to post before resolving
#
# Environment (set by composite action):
# MENTION_REPO - Repository (owner/repo format)
# MENTION_PR_NUMBER - Pull request number
# GITHUB_TOKEN - GitHub API token
#
# Behavior:
# 1. If COMMENT is provided, posts it as a reply to the thread
# 2. Resolves the thread

# Validate required environment variables
: "${MENTION_REPO:?MENTION_REPO environment variable is required}"
: "${MENTION_PR_NUMBER:?MENTION_PR_NUMBER environment variable is required}"
THREAD_ID="${1:?Thread ID required}"
COMMENT="${2:-}"

# Step 1: Post comment if provided
if [ -n "$COMMENT" ]; then
echo "Posting comment to thread..." >&2
COMMENT_RESULT=$(gh api graphql -f query='
mutation($threadId: ID!, $body: String!) {
addPullRequestReviewThreadReply(input: {
pullRequestReviewThreadId: $threadId,
body: $body
}) {
comment {
id
}
}
}' -f threadId="$THREAD_ID" -f body="$COMMENT")
if echo "$COMMENT_RESULT" | jq -e '.errors' > /dev/null 2>&1; then
echo "Error posting comment: $COMMENT_RESULT" >&2
exit 1
fi
fi

# Step 2: Resolve the thread
echo "Resolving thread..." >&2
RESOLVE_RESULT=$(gh api graphql -f query='
mutation($threadId: ID!) {
resolveReviewThread(input: {threadId: $threadId}) {
thread {
id
isResolved
}
}
}' -f threadId="$THREAD_ID" --jq '.data.resolveReviewThread.thread')

echo "$RESOLVE_RESULT"
echo "✓ Thread resolved" >&2
Loading
Loading