Skip to content

feat: fastmcpp 3.x parity sync#31

Closed
0xeb wants to merge 3 commits intomainfrom
feature/sync-2026-02-14-squash
Closed

feat: fastmcpp 3.x parity sync#31
0xeb wants to merge 3 commits intomainfrom
feature/sync-2026-02-14-squash

Conversation

@0xeb
Copy link
Copy Markdown
Owner

@0xeb 0xeb commented Feb 15, 2026

Summary

  • Syncs fastmcpp to Python fastmcp v3.0.0b2 (3.x parity)
  • Adds MCP Apps support (AppConfig, UI metadata on tools/resources/prompts)
  • Adds generate-cli, install, list, call, discover CLI commands
  • Adds background tasks protocol (SEP-1686 subset)
  • Adds OpenAPI Provider, Skills Provider, and provider transforms (version filter, prompts-as-tools, resources-as-tools)
  • Adds ResponseLimitingMiddleware with UTF-8 safe truncation and PingMiddleware
  • Adds Streamable HTTP transport, session state sharing, server-initiated requests (sampling/elicitation)
  • Adds cursor-based pagination, sequential tool execution flag, tool hidden/enabled flag, $ref dereferencing toggle
  • Removes WebSocket transport (aligned with MCP spec direction toward Streamable HTTP)
  • Fixes generated CLI scripts failing on Windows due to fastmcpp binary not in PATH

Test plan

  • Full build passes (0 warnings)
  • 86/86 tests pass (including previously failing generated_cli_e2e)
  • New test coverage: providers (OpenAPI, skills, version filter), MCP apps, CLI E2E, tasks CLI, pagination, response limiting, session state, sequential tools, tool transforms

0xeb added 3 commits February 15, 2026 07:39
Generated Python CLI scripts now look for the fastmcpp binary next to
the script itself before falling back to PATH lookup. Fixes
FileNotFoundError on Windows where the binary isn't in PATH.
0xeb added a commit that referenced this pull request Feb 17, 2026
…ssW)

Replace the FetchContent dependency on tiny-process-library with internal
cross-platform process code adapted from copilot-sdk-cpp. This eliminates
an external dependency that was transitively inherited by downstream
projects (libagents -> fastmcpp_core).

Win32 implementation upgraded from CreateProcessA to CreateProcessW:
- UTF-8/UTF-16 conversion via utf8_to_wide() helper
- STARTUPINFOEXW with explicit handle inheritance (PROC_THREAD_ATTRIBUTE_HANDLE_LIST)
- Job Object for automatic child cleanup
- CREATE_NO_WINDOW to prevent console popups
- Stderr redirected to NUL when not captured

StdioTransport rewritten from callback-based (deque + condition_variable)
to synchronous pipe model (direct read_line on stdout pipe), with a
background stderr reader thread in keep-alive mode to prevent pipe buffer
deadlock. Process liveness is checked during timeout polling (200ms
intervals) for fast failure detection when servers crash.

Also fixes two CI issues from PR #31:
- openapi_provider.hpp: brace-init default param -> explicit Options{}
- transports.hpp: add missing override on session_id/has_session

New tests: stdio_lifecycle, stdio_stderr, stdio_timeout.
All 89 tests pass.
0xeb added a commit that referenced this pull request Feb 17, 2026
…ssW)

Replace the FetchContent dependency on tiny-process-library with internal
cross-platform process code adapted from copilot-sdk-cpp. This eliminates
an external dependency that was transitively inherited by downstream
projects (libagents -> fastmcpp_core).

Win32 implementation upgraded from CreateProcessA to CreateProcessW:
- UTF-8/UTF-16 conversion via utf8_to_wide() helper
- STARTUPINFOEXW with explicit handle inheritance (PROC_THREAD_ATTRIBUTE_HANDLE_LIST)
- Job Object for automatic child cleanup
- CREATE_NO_WINDOW to prevent console popups
- Stderr redirected to NUL when not captured

StdioTransport rewritten from callback-based (deque + condition_variable)
to synchronous pipe model (direct read_line on stdout pipe), with a
background stderr reader thread in keep-alive mode to prevent pipe buffer
deadlock. Process liveness is checked during timeout polling (200ms
intervals) for fast failure detection when servers crash.

Also fixes two CI issues from PR #31:
- openapi_provider.hpp: brace-init default param -> explicit Options{}
- transports.hpp: add missing override on session_id/has_session

New tests: stdio_lifecycle, stdio_stderr, stdio_timeout.
All 89 tests pass.
0xeb added a commit that referenced this pull request Feb 17, 2026
…ssW)

Replace the FetchContent dependency on tiny-process-library with internal
cross-platform process code adapted from copilot-sdk-cpp. This eliminates
an external dependency that was transitively inherited by downstream
projects (libagents -> fastmcpp_core).

Win32 implementation upgraded from CreateProcessA to CreateProcessW:
- UTF-8/UTF-16 conversion via utf8_to_wide() helper
- STARTUPINFOEXW with explicit handle inheritance (PROC_THREAD_ATTRIBUTE_HANDLE_LIST)
- Job Object for automatic child cleanup
- CREATE_NO_WINDOW to prevent console popups
- Stderr redirected to NUL when not captured

StdioTransport rewritten from callback-based (deque + condition_variable)
to synchronous pipe model (direct read_line on stdout pipe), with a
background stderr reader thread in keep-alive mode to prevent pipe buffer
deadlock. Process liveness is checked during timeout polling (200ms
intervals) for fast failure detection when servers crash.

Also fixes two CI issues from PR #31:
- openapi_provider.hpp: brace-init default param -> explicit Options{}
- transports.hpp: add missing override on session_id/has_session

New tests: stdio_lifecycle, stdio_stderr, stdio_timeout.
All 89 tests pass.
@0xeb
Copy link
Copy Markdown
Owner Author

0xeb commented Feb 17, 2026

Superseded by PR #32 which includes these changes plus the tiny-process-library replacement.

@0xeb 0xeb closed this Feb 17, 2026
@0xeb 0xeb deleted the feature/sync-2026-02-14-squash branch February 17, 2026 03:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant