actions-runtime 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. actions_runtime-1.0.1/PKG-INFO +153 -0
  2. actions_runtime-1.0.1/README.md +112 -0
  3. actions_runtime-1.0.1/build.py +183 -0
  4. actions_runtime-1.0.1/pyproject.toml +133 -0
  5. actions_runtime-1.0.1/setup.py +82 -0
  6. actions_runtime-1.0.1/src/actions/server/README.md +21 -0
  7. actions_runtime-1.0.1/src/actions/server/__init__.py +6 -0
  8. actions_runtime-1.0.1/src/actions/server/__main__.py +23 -0
  9. actions_runtime-1.0.1/src/actions/server/_action_package_handler.py +299 -0
  10. actions_runtime-1.0.1/src/actions/server/_actions_cloud.py +157 -0
  11. actions_runtime-1.0.1/src/actions/server/_actions_import.py +556 -0
  12. actions_runtime-1.0.1/src/actions/server/_actions_process_pool.py +1144 -0
  13. actions_runtime-1.0.1/src/actions/server/_actions_run.py +902 -0
  14. actions_runtime-1.0.1/src/actions/server/_actions_run_helpers.py +43 -0
  15. actions_runtime-1.0.1/src/actions/server/_api_action_package.py +65 -0
  16. actions_runtime-1.0.1/src/actions/server/_api_action_routes.py +317 -0
  17. actions_runtime-1.0.1/src/actions/server/_api_analytics.py +250 -0
  18. actions_runtime-1.0.1/src/actions/server/_api_oauth2.py +693 -0
  19. actions_runtime-1.0.1/src/actions/server/_api_robots.py +1174 -0
  20. actions_runtime-1.0.1/src/actions/server/_api_run.py +445 -0
  21. actions_runtime-1.0.1/src/actions/server/_api_schedules.py +1495 -0
  22. actions_runtime-1.0.1/src/actions/server/_api_secrets.py +164 -0
  23. actions_runtime-1.0.1/src/actions/server/_api_triggers.py +664 -0
  24. actions_runtime-1.0.1/src/actions/server/_api_work_items.py +372 -0
  25. actions_runtime-1.0.1/src/actions/server/_app.py +138 -0
  26. actions_runtime-1.0.1/src/actions/server/_artifact_storage.py +280 -0
  27. actions_runtime-1.0.1/src/actions/server/_ask_user.py +109 -0
  28. actions_runtime-1.0.1/src/actions/server/_build_common/__init__.py +1 -0
  29. actions_runtime-1.0.1/src/actions/server/_build_common/build_executable.py +45 -0
  30. actions_runtime-1.0.1/src/actions/server/_build_common/entitlements.py +23 -0
  31. actions_runtime-1.0.1/src/actions/server/_build_common/file_from_function.py +37 -0
  32. actions_runtime-1.0.1/src/actions/server/_build_common/process_call.py +43 -0
  33. actions_runtime-1.0.1/src/actions/server/_build_common/py.typed +0 -0
  34. actions_runtime-1.0.1/src/actions/server/_build_common/root_dir.py +19 -0
  35. actions_runtime-1.0.1/src/actions/server/_build_common/signing.py +272 -0
  36. actions_runtime-1.0.1/src/actions/server/_build_common/version_from_github_actions.py +83 -0
  37. actions_runtime-1.0.1/src/actions/server/_build_common/workflows.py +245 -0
  38. actions_runtime-1.0.1/src/actions/server/_build_common/zip_assets.py +43 -0
  39. actions_runtime-1.0.1/src/actions/server/_cli_helpers.py +102 -0
  40. actions_runtime-1.0.1/src/actions/server/_cli_impl.py +1039 -0
  41. actions_runtime-1.0.1/src/actions/server/_common/__init__.py +12 -0
  42. actions_runtime-1.0.1/src/actions/server/_common/action_package_handling/__init__.py +445 -0
  43. actions_runtime-1.0.1/src/actions/server/_common/action_package_handling/cli_errors.py +5 -0
  44. actions_runtime-1.0.1/src/actions/server/_common/app_mutex.py +125 -0
  45. actions_runtime-1.0.1/src/actions/server/_common/autoexit.py +78 -0
  46. actions_runtime-1.0.1/src/actions/server/_common/callback.py +79 -0
  47. actions_runtime-1.0.1/src/actions/server/_common/gallery.py +203 -0
  48. actions_runtime-1.0.1/src/actions/server/_common/gen_certificate.py +67 -0
  49. actions_runtime-1.0.1/src/actions/server/_common/locations.py +47 -0
  50. actions_runtime-1.0.1/src/actions/server/_common/ls_protocols.py +66 -0
  51. actions_runtime-1.0.1/src/actions/server/_common/monitor.py +41 -0
  52. actions_runtime-1.0.1/src/actions/server/_common/null.py +61 -0
  53. actions_runtime-1.0.1/src/actions/server/_common/oauth2_settings.py +308 -0
  54. actions_runtime-1.0.1/src/actions/server/_common/package_deps/__init__.py +0 -0
  55. actions_runtime-1.0.1/src/actions/server/_common/package_deps/_conda_deps.py +57 -0
  56. actions_runtime-1.0.1/src/actions/server/_common/package_deps/_deps_protocols.py +173 -0
  57. actions_runtime-1.0.1/src/actions/server/_common/package_deps/_package_deps.py +45 -0
  58. actions_runtime-1.0.1/src/actions/server/_common/package_deps/_pip_deps.py +78 -0
  59. actions_runtime-1.0.1/src/actions/server/_common/package_deps/analyzer.py +636 -0
  60. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_cloud.py +699 -0
  61. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/__init__.py +0 -0
  62. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_channel.py +39 -0
  63. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_match_spec.py +311 -0
  64. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_path.py +306 -0
  65. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_url.py +458 -0
  66. actions_runtime-1.0.1/src/actions/server/_common/package_deps/conda_impl/conda_version.py +703 -0
  67. actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/__init__.py +0 -0
  68. actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/pip_distlib_util.py +238 -0
  69. actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/pip_packaging_structure.py +61 -0
  70. actions_runtime-1.0.1/src/actions/server/_common/package_deps/pip_impl/pip_packaging_version.py +505 -0
  71. actions_runtime-1.0.1/src/actions/server/_common/package_deps/pypi_cloud.py +215 -0
  72. actions_runtime-1.0.1/src/actions/server/_common/package_exclude.py +164 -0
  73. actions_runtime-1.0.1/src/actions/server/_common/process.py +799 -0
  74. actions_runtime-1.0.1/src/actions/server/_common/protocols.py +91 -0
  75. actions_runtime-1.0.1/src/actions/server/_common/py.typed +0 -0
  76. actions_runtime-1.0.1/src/actions/server/_common/run_in_thread.py +67 -0
  77. actions_runtime-1.0.1/src/actions/server/_common/system_mutex.py +441 -0
  78. actions_runtime-1.0.1/src/actions/server/_common/termcolors/__init__.py +20 -0
  79. actions_runtime-1.0.1/src/actions/server/_common/text.py +40 -0
  80. actions_runtime-1.0.1/src/actions/server/_common/tools.py +360 -0
  81. actions_runtime-1.0.1/src/actions/server/_common/uris.py +189 -0
  82. actions_runtime-1.0.1/src/actions/server/_common/url_callback_server.py +283 -0
  83. actions_runtime-1.0.1/src/actions/server/_common/wait_for.py +101 -0
  84. actions_runtime-1.0.1/src/actions/server/_common/yaml_with_location.py +246 -0
  85. actions_runtime-1.0.1/src/actions/server/_community_expose.py +897 -0
  86. actions_runtime-1.0.1/src/actions/server/_database.py +1328 -0
  87. actions_runtime-1.0.1/src/actions/server/_datadir_commands.py +50 -0
  88. actions_runtime-1.0.1/src/actions/server/_devenv.py +161 -0
  89. actions_runtime-1.0.1/src/actions/server/_download_rcc.py +112 -0
  90. actions_runtime-1.0.1/src/actions/server/_encryption.py +293 -0
  91. actions_runtime-1.0.1/src/actions/server/_errors.py +124 -0
  92. actions_runtime-1.0.1/src/actions/server/_errors_action_server.py +6 -0
  93. actions_runtime-1.0.1/src/actions/server/_gen_ids.py +36 -0
  94. actions_runtime-1.0.1/src/actions/server/_mode.py +273 -0
  95. actions_runtime-1.0.1/src/actions/server/_models.py +535 -0
  96. actions_runtime-1.0.1/src/actions/server/_new_project.py +160 -0
  97. actions_runtime-1.0.1/src/actions/server/_new_project_helpers.py +233 -0
  98. actions_runtime-1.0.1/src/actions/server/_notifications.py +333 -0
  99. actions_runtime-1.0.1/src/actions/server/_oauth2.py +98 -0
  100. actions_runtime-1.0.1/src/actions/server/_oauth2_config.py +7 -0
  101. actions_runtime-1.0.1/src/actions/server/_preload_actions/__init__.py +0 -0
  102. actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions.py +21 -0
  103. actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_autoexit.py +192 -0
  104. actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_server_main.py +332 -0
  105. actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_streams.py +252 -0
  106. actions_runtime-1.0.1/src/actions/server/_preload_actions/preload_actions_teardown.py +31 -0
  107. actions_runtime-1.0.1/src/actions/server/_protocols.py +326 -0
  108. actions_runtime-1.0.1/src/actions/server/_rcc.py +489 -0
  109. actions_runtime-1.0.1/src/actions/server/_rcc_robot_utils.py +462 -0
  110. actions_runtime-1.0.1/src/actions/server/_rcc_runtime_adapter.py +468 -0
  111. actions_runtime-1.0.1/src/actions/server/_robo_utils/auth.py +22 -0
  112. actions_runtime-1.0.1/src/actions/server/_robo_utils/callback.py +52 -0
  113. actions_runtime-1.0.1/src/actions/server/_robo_utils/constants.py +63 -0
  114. actions_runtime-1.0.1/src/actions/server/_robo_utils/log_custom_handler.py +34 -0
  115. actions_runtime-1.0.1/src/actions/server/_robo_utils/log_formatter.py +69 -0
  116. actions_runtime-1.0.1/src/actions/server/_robo_utils/process.py +393 -0
  117. actions_runtime-1.0.1/src/actions/server/_robo_utils/run_in_thread.py +43 -0
  118. actions_runtime-1.0.1/src/actions/server/_robo_utils/system_mutex.py +404 -0
  119. actions_runtime-1.0.1/src/actions/server/_runs_state_cache.py +203 -0
  120. actions_runtime-1.0.1/src/actions/server/_scheduler.py +1090 -0
  121. actions_runtime-1.0.1/src/actions/server/_selftest.py +806 -0
  122. actions_runtime-1.0.1/src/actions/server/_server.py +789 -0
  123. actions_runtime-1.0.1/src/actions/server/_server_websockets.py +342 -0
  124. actions_runtime-1.0.1/src/actions/server/_settings.py +560 -0
  125. actions_runtime-1.0.1/src/actions/server/_slugify.py +40 -0
  126. actions_runtime-1.0.1/src/actions/server/_static_contents.py +8 -0
  127. actions_runtime-1.0.1/src/actions/server/_storage.py +204 -0
  128. actions_runtime-1.0.1/src/actions/server/_triggers.py +596 -0
  129. actions_runtime-1.0.1/src/actions/server/_user_session.py +284 -0
  130. actions_runtime-1.0.1/src/actions/server/_watcher.py +37 -0
  131. actions_runtime-1.0.1/src/actions/server/_whitelist.py +70 -0
  132. actions_runtime-1.0.1/src/actions/server/_work_items_import.py +98 -0
  133. actions_runtime-1.0.1/src/actions/server/_work_items_paths.py +19 -0
  134. actions_runtime-1.0.1/src/actions/server/api.py +42 -0
  135. actions_runtime-1.0.1/src/actions/server/bin/.gitignore +1 -0
  136. actions_runtime-1.0.1/src/actions/server/cli.py +69 -0
  137. actions_runtime-1.0.1/src/actions/server/env/__init__.py +26 -0
  138. actions_runtime-1.0.1/src/actions/server/index.html +213 -0
  139. actions_runtime-1.0.1/src/actions/server/mcp/__init__.py +0 -0
  140. actions_runtime-1.0.1/src/actions/server/mcp/gateway_metadata.py +512 -0
  141. actions_runtime-1.0.1/src/actions/server/mcp/setup_mcp_server_from_actions.py +5 -0
  142. actions_runtime-1.0.1/src/actions/server/mcp/setup_mcp_server_v2.py +407 -0
  143. actions_runtime-1.0.1/src/actions/server/migrations/__init__.py +217 -0
  144. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_action_enabled.py +15 -0
  145. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_action_managed_params.py +15 -0
  146. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_action_options.py +15 -0
  147. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_code_verifier.py +15 -0
  148. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_is_consequential.py +15 -0
  149. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_request_id_to_run.py +19 -0
  150. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_robot_run_columns.py +31 -0
  151. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_schedules.py +210 -0
  152. actions_runtime-1.0.1/src/actions/server/migrations/migration_add_session_and_indexes.py +57 -0
  153. actions_runtime-1.0.1/src/actions/server/migrations/migration_align_schema_indexes.py +49 -0
  154. actions_runtime-1.0.1/src/actions/server/migrations/migration_initial.py +9 -0
  155. actions_runtime-1.0.1/src/actions/server/migrations/migration_reconcile_run_columns.py +79 -0
  156. actions_runtime-1.0.1/src/actions/server/migrations/migration_reconcile_schema.py +22 -0
  157. actions_runtime-1.0.1/src/actions/server/package/__init__.py +0 -0
  158. actions_runtime-1.0.1/src/actions/server/package/_package_build.py +157 -0
  159. actions_runtime-1.0.1/src/actions/server/package/_package_build_cli.py +651 -0
  160. actions_runtime-1.0.1/src/actions/server/package/_package_metadata.py +198 -0
  161. actions_runtime-1.0.1/src/actions/server/package/_package_publish.py +120 -0
  162. actions_runtime-1.0.1/src/actions/server/package/_package_publish_api.py +461 -0
  163. actions_runtime-1.0.1/src/actions/server/package/_package_reader.py +54 -0
  164. actions_runtime-1.0.1/src/actions/server/package/package_exclude.py +138 -0
  165. actions_runtime-1.0.1/src/actions/server/py.typed +0 -0
  166. actions_runtime-1.0.1/src/actions/server/templates/action-templates.yaml +10 -0
  167. actions_runtime-1.0.1/src/actions/server/templates/action-templates.zip +0 -0
  168. actions_runtime-1.0.1/src/actions/server/templates/zips/advanced.zip +0 -0
  169. actions_runtime-1.0.1/src/actions/server/templates/zips/basic.zip +0 -0
  170. actions_runtime-1.0.1/src/actions/server/templates/zips/minimal.zip +0 -0
  171. actions_runtime-1.0.1/src/actions/server/templates/zips/workflow-producer-consumer.zip +0 -0
  172. actions_runtime-1.0.1/src/actions/server/vendored_deps/README.md +8 -0
  173. actions_runtime-1.0.1/src/actions/server/vendored_deps/__init__.py +0 -0
  174. actions_runtime-1.0.1/src/actions/server/vendored_deps/action_package_handling/__init__.py +445 -0
  175. actions_runtime-1.0.1/src/actions/server/vendored_deps/action_package_handling/cli_errors.py +5 -0
  176. actions_runtime-1.0.1/src/actions/server/vendored_deps/gen_certificate.py +71 -0
  177. actions_runtime-1.0.1/src/actions/server/vendored_deps/ls_protocols.py +66 -0
  178. actions_runtime-1.0.1/src/actions/server/vendored_deps/oauth2_settings.py +288 -0
  179. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/__init__.py +0 -0
  180. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_conda_deps.py +57 -0
  181. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_deps_protocols.py +173 -0
  182. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_package_deps.py +45 -0
  183. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/_pip_deps.py +78 -0
  184. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/analyzer.py +636 -0
  185. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_cloud.py +699 -0
  186. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/__init__.py +0 -0
  187. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_channel.py +39 -0
  188. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_match_spec.py +311 -0
  189. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_path.py +306 -0
  190. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_url.py +458 -0
  191. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/conda_impl/conda_version.py +703 -0
  192. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/__init__.py +0 -0
  193. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/pip_distlib_util.py +238 -0
  194. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/pip_packaging_structure.py +61 -0
  195. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pip_impl/pip_packaging_version.py +505 -0
  196. actions_runtime-1.0.1/src/actions/server/vendored_deps/package_deps/pypi_cloud.py +215 -0
  197. actions_runtime-1.0.1/src/actions/server/vendored_deps/termcolors/__init__.py +20 -0
  198. actions_runtime-1.0.1/src/actions/server/vendored_deps/url_callback_server.py +293 -0
  199. actions_runtime-1.0.1/src/actions/server/vendored_deps/yaml_with_location.py +246 -0
@@ -0,0 +1,153 @@
1
+ Metadata-Version: 2.4
2
+ Name: actions-runtime
3
+ Version: 1.0.1
4
+ Summary: Community Action Server
5
+ License: Apache-2.0
6
+ Author: Sema4.ai, Inc.
7
+ Author-email: dev@sema4.ai
8
+ Requires-Python: >=3.12,<3.14
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Requires-Dist: actions-core (>=1.0.0,<2.0.0)
14
+ Requires-Dist: actions-http-helper (>=1.0.0,<2.0.0)
15
+ Requires-Dist: actions-work-items (>=0.4.4,<0.5.0)
16
+ Requires-Dist: aiohttp (>=3.13.2,<4.0.0)
17
+ Requires-Dist: aiosmtplib (>=3.0.0,<4.0.0)
18
+ Requires-Dist: croniter (>=2.0.0,<3.0.0)
19
+ Requires-Dist: cryptography (>=46.0.3,<47.0.0)
20
+ Requires-Dist: fastapi-slim (>=0.121.1,<0.122.0)
21
+ Requires-Dist: jsonschema (>=4.23.0,<5.0.0)
22
+ Requires-Dist: jsonschema-specifications (>=2024.10.1,<2025.0.0)
23
+ Requires-Dist: mcp (>=2.0.0,<3.0.0)
24
+ Requires-Dist: msgspec (>=0.19,<0.20)
25
+ Requires-Dist: psutil (>=5.0,<8.0)
26
+ Requires-Dist: psycopg[binary] (>=3.2.0,<4.0.0)
27
+ Requires-Dist: pydantic (>=2.12.4,<3.0.0)
28
+ Requires-Dist: pytz (>=2024.1,<2025.0)
29
+ Requires-Dist: pyyaml (>=6.0.3,<7.0.0)
30
+ Requires-Dist: redis (>=5.0.0,<6.0.0)
31
+ Requires-Dist: requests (>=2,<3)
32
+ Requires-Dist: requests_oauthlib (>=2.0,<3.0)
33
+ Requires-Dist: termcolor (>=3.2.0,<4.0.0)
34
+ Requires-Dist: uvicorn (>=0.38.0,<0.39.0)
35
+ Requires-Dist: watchfiles (>=1.1.1,<2.0.0)
36
+ Requires-Dist: websockets (>=15.0.1,<16.0.0)
37
+ Project-URL: Homepage, https://github.com/joshyorko/actions/tree/community
38
+ Project-URL: Repository, https://github.com/joshyorko/actions/tree/community
39
+ Description-Content-Type: text/markdown
40
+
41
+ # actions-runtime
42
+
43
+ [Sema4.ai Action Server](https://github.com/sema4ai/actions#readme) is a Python framework designed to provide your Python functions to AI Agents. It works both as an MCP Server (hosting tools, resources and prompts) and also provides an OpenAPI compatible API.
44
+
45
+ A `tool` or `action` in this case is defined as a Python function (which has inputs/outputs defined), which is served by the `Sema4.ai Action Server`.
46
+
47
+ The `Sema4.ai Action Server` automatically provides a `/mcp` endpoint for connecting `MCP` clients and also generates an OpenAPI spec for your Python code, enabling different AI/LLM Agents to understand and call your Action. It also manages the Action lifecycle and provides full traceability of what happened during any tool or action call (open the `/runs` endpoint in a browser to see not only inputs and output, but also a full `log.html` with internal details, such as variables and function calls that your Python function executed).
48
+
49
+ ## 1. Install Action Server
50
+
51
+ Action Server is available as a stand-alone fully signed executable and via `pip install actions-runtime`.
52
+
53
+ > We recommend the executable to prevent confusion in case you have multiple/crowded Python environments, etc.
54
+
55
+ #### For macOS
56
+
57
+ ```sh
58
+ # Install Actions Runtime
59
+ python -m pip install actions-runtime
60
+ ```
61
+
62
+ #### For Windows
63
+
64
+ ```sh
65
+ # Download Sema4.ai Action Server
66
+ curl -o action-server.exe https://cdn.sema4.ai/action-server/releases/latest/windows64/action-server.exe
67
+
68
+ # Add to PATH or move to a folder that is in PATH
69
+ setx PATH=%PATH%;%CD%
70
+ ```
71
+
72
+ #### For Linux
73
+
74
+ ```sh
75
+ # Download Sema4.ai Action Server
76
+ curl -o action-server https://cdn.sema4.ai/action-server/releases/latest/linux64/action-server
77
+ chmod a+x action-server
78
+
79
+ # Add to PATH or move to a folder that is in PATH
80
+ sudo mv action-server /usr/local/bin/
81
+ ```
82
+
83
+ ## 2. Run your first MCP tool
84
+
85
+ ```sh
86
+ # Bootstrap a new project using this template.
87
+ # You'll be prompted for the name of the project (directory):
88
+ action-server new
89
+
90
+ # Start Action Server
91
+ cd my-project
92
+ action-server start
93
+ ```
94
+
95
+ 👉 You should now have an Action Server running locally at: [http://localhost:8080](http://localhost:8080), so open that in your browser and the web UI will guide you further.
96
+
97
+ ### MCP compatibility
98
+
99
+ `/mcp` supports the MCP `2026-07-28` per-request contract through the Python
100
+ MCP SDK v2. Clients use `server/discover` and then send calls without an
101
+ `initialize`/`initialized` exchange or `Mcp-Session-Id`. The legacy `/sse`
102
+ endpoint and initialization/session-era compatibility path are intentionally
103
+ not provided.
104
+
105
+ ## What do you need in your Action Package
106
+
107
+ An `Action Package` is currently defined as a local folder that contains at least one Python file containing an action entry point (a Python function marked with `@action` -decorator from `actions`).
108
+
109
+ The `package.yaml` file is required for specifying the Python environment and dependencies for your Action ([RCC](https://github.com/joshyorko/rcc/) will be used to automatically bootstrap it and keep it updated given the `package.yaml` contents).
110
+
111
+ > Note: the `package.yaml` is optional if the action server is not being used as a standalone (i.e.: if it was pip-installed it can use the same python environment where it's installed).
112
+
113
+ ### Community RCC Fork
114
+
115
+ This Action Server uses the **joshyorko/rcc v18.19.3** community fork, which provides:
116
+ - **Faster startup** - no proprietary cloud service calls
117
+ - **Official sources** - downloads micromamba directly from conda-forge instead of Robocorp CDN
118
+ - **Decoupled infrastructure** - works fully offline after initial environment bootstrap
119
+ - **Security hardening** - includes upstream archive extraction and TLS fixes, built with Go 1.25.7
120
+
121
+ Environment caching means subsequent startups are near-instant once the holotree is built.
122
+
123
+ ### Bootstrapping a new Action
124
+
125
+ Start new projects with:
126
+
127
+ `action-server new`
128
+
129
+ Note: the `action-server` executable should be automatically added to your Python installation after `pip install actions-runtime`; if it was not, use `python -m actions.server` instead.
130
+
131
+ After creating the project, it's possible to serve the actions under the current directory with:
132
+
133
+ `action-server start`
134
+
135
+ For example: When running `action-server start`, the action server will scan for existing actions under the current directory, and it'll start serving those.
136
+
137
+ After it's started, it's possible to access the following URLs:
138
+
139
+ - `/index.html`: UI for the Action Server.
140
+ - `/openapi.json`: Provides the openapi spec for the action server.
141
+ - `/docs`: Provides access to the APIs available in the server and a UI to test it.
142
+
143
+ ## Documentation
144
+
145
+ Explore our [docs](https://github.com/sema4ai/actions/tree/master/action_server/docs) for extensive documentation.
146
+
147
+ ## Changelog
148
+
149
+ Clean-break Actions Runtime releases and `actions-runtime-*` tags use the
150
+ [Actions Runtime changelog](./docs/ACTIONS_RUNTIME_CHANGELOG.md). The historical
151
+ [Action Server changelog](https://github.com/sema4ai/actions/blob/master/action_server/docs/CHANGELOG.md)
152
+ is retained for the older `action-server-v1.2.x` delivery line.
153
+
@@ -0,0 +1,112 @@
1
+ # actions-runtime
2
+
3
+ [Sema4.ai Action Server](https://github.com/sema4ai/actions#readme) is a Python framework designed to provide your Python functions to AI Agents. It works both as an MCP Server (hosting tools, resources and prompts) and also provides an OpenAPI compatible API.
4
+
5
+ A `tool` or `action` in this case is defined as a Python function (which has inputs/outputs defined), which is served by the `Sema4.ai Action Server`.
6
+
7
+ The `Sema4.ai Action Server` automatically provides a `/mcp` endpoint for connecting `MCP` clients and also generates an OpenAPI spec for your Python code, enabling different AI/LLM Agents to understand and call your Action. It also manages the Action lifecycle and provides full traceability of what happened during any tool or action call (open the `/runs` endpoint in a browser to see not only inputs and output, but also a full `log.html` with internal details, such as variables and function calls that your Python function executed).
8
+
9
+ ## 1. Install Action Server
10
+
11
+ Action Server is available as a stand-alone fully signed executable and via `pip install actions-runtime`.
12
+
13
+ > We recommend the executable to prevent confusion in case you have multiple/crowded Python environments, etc.
14
+
15
+ #### For macOS
16
+
17
+ ```sh
18
+ # Install Actions Runtime
19
+ python -m pip install actions-runtime
20
+ ```
21
+
22
+ #### For Windows
23
+
24
+ ```sh
25
+ # Download Sema4.ai Action Server
26
+ curl -o action-server.exe https://cdn.sema4.ai/action-server/releases/latest/windows64/action-server.exe
27
+
28
+ # Add to PATH or move to a folder that is in PATH
29
+ setx PATH=%PATH%;%CD%
30
+ ```
31
+
32
+ #### For Linux
33
+
34
+ ```sh
35
+ # Download Sema4.ai Action Server
36
+ curl -o action-server https://cdn.sema4.ai/action-server/releases/latest/linux64/action-server
37
+ chmod a+x action-server
38
+
39
+ # Add to PATH or move to a folder that is in PATH
40
+ sudo mv action-server /usr/local/bin/
41
+ ```
42
+
43
+ ## 2. Run your first MCP tool
44
+
45
+ ```sh
46
+ # Bootstrap a new project using this template.
47
+ # You'll be prompted for the name of the project (directory):
48
+ action-server new
49
+
50
+ # Start Action Server
51
+ cd my-project
52
+ action-server start
53
+ ```
54
+
55
+ 👉 You should now have an Action Server running locally at: [http://localhost:8080](http://localhost:8080), so open that in your browser and the web UI will guide you further.
56
+
57
+ ### MCP compatibility
58
+
59
+ `/mcp` supports the MCP `2026-07-28` per-request contract through the Python
60
+ MCP SDK v2. Clients use `server/discover` and then send calls without an
61
+ `initialize`/`initialized` exchange or `Mcp-Session-Id`. The legacy `/sse`
62
+ endpoint and initialization/session-era compatibility path are intentionally
63
+ not provided.
64
+
65
+ ## What do you need in your Action Package
66
+
67
+ An `Action Package` is currently defined as a local folder that contains at least one Python file containing an action entry point (a Python function marked with `@action` -decorator from `actions`).
68
+
69
+ The `package.yaml` file is required for specifying the Python environment and dependencies for your Action ([RCC](https://github.com/joshyorko/rcc/) will be used to automatically bootstrap it and keep it updated given the `package.yaml` contents).
70
+
71
+ > Note: the `package.yaml` is optional if the action server is not being used as a standalone (i.e.: if it was pip-installed it can use the same python environment where it's installed).
72
+
73
+ ### Community RCC Fork
74
+
75
+ This Action Server uses the **joshyorko/rcc v18.19.3** community fork, which provides:
76
+ - **Faster startup** - no proprietary cloud service calls
77
+ - **Official sources** - downloads micromamba directly from conda-forge instead of Robocorp CDN
78
+ - **Decoupled infrastructure** - works fully offline after initial environment bootstrap
79
+ - **Security hardening** - includes upstream archive extraction and TLS fixes, built with Go 1.25.7
80
+
81
+ Environment caching means subsequent startups are near-instant once the holotree is built.
82
+
83
+ ### Bootstrapping a new Action
84
+
85
+ Start new projects with:
86
+
87
+ `action-server new`
88
+
89
+ Note: the `action-server` executable should be automatically added to your Python installation after `pip install actions-runtime`; if it was not, use `python -m actions.server` instead.
90
+
91
+ After creating the project, it's possible to serve the actions under the current directory with:
92
+
93
+ `action-server start`
94
+
95
+ For example: When running `action-server start`, the action server will scan for existing actions under the current directory, and it'll start serving those.
96
+
97
+ After it's started, it's possible to access the following URLs:
98
+
99
+ - `/index.html`: UI for the Action Server.
100
+ - `/openapi.json`: Provides the openapi spec for the action server.
101
+ - `/docs`: Provides access to the APIs available in the server and a UI to test it.
102
+
103
+ ## Documentation
104
+
105
+ Explore our [docs](https://github.com/sema4ai/actions/tree/master/action_server/docs) for extensive documentation.
106
+
107
+ ## Changelog
108
+
109
+ Clean-break Actions Runtime releases and `actions-runtime-*` tags use the
110
+ [Actions Runtime changelog](./docs/ACTIONS_RUNTIME_CHANGELOG.md). The historical
111
+ [Action Server changelog](https://github.com/sema4ai/actions/blob/master/action_server/docs/CHANGELOG.md)
112
+ is retained for the older `action-server-v1.2.x` delivery line.
@@ -0,0 +1,183 @@
1
+ import logging
2
+ import os
3
+ import platform
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ log = logging.getLogger(__name__)
8
+
9
+ # No real build, just download RCC at this point.
10
+
11
+ # Note: referenced here and in actions.server._download_rcc
12
+ # Using joshyorko/rcc open-source version
13
+ RCC_VERSION = "18.19.3"
14
+
15
+
16
+ CURDIR = Path(__file__).parent.absolute()
17
+
18
+
19
+ def _download_with_resume(url: str, target: Path) -> Path:
20
+ import stat
21
+
22
+ log.info(f"Downloading '{url}' to '{target}'")
23
+
24
+ chunk_size = 1024 * 5
25
+ with _open_urllib(url) as response:
26
+ content_size = int(response.getheader("Content-Length") or -1)
27
+ try:
28
+ with open(target, "wb") as stream:
29
+ while True:
30
+ chunk = response.read(chunk_size)
31
+ if not chunk:
32
+ # Note: in a bad connection it can return an empty chunk
33
+ # even before finishing (so, we resume it afterward if
34
+ # that was the case).
35
+ break
36
+ stream.write(chunk)
37
+ except Exception:
38
+ # Non-resumable case, just raise.
39
+ if content_size <= 0:
40
+ raise
41
+ # Otherwise, keep on going to resume the download if it still
42
+ # hasn't finished.
43
+
44
+ MAX_TRIES = 10
45
+ for i in range(MAX_TRIES):
46
+ curr_file_size = _get_file_size(target)
47
+
48
+ if content_size > 0:
49
+ # It can be resumed.
50
+ if content_size > curr_file_size:
51
+ log.info(
52
+ f"Resuming download of '{url}' to '{target}' (downloaded {curr_file_size} of {content_size} (bytes))"
53
+ )
54
+ try:
55
+ _resume_download(url, target, chunk_size)
56
+ except Exception:
57
+ if i == MAX_TRIES - 1:
58
+ raise
59
+ else:
60
+ break
61
+ else:
62
+ # It cannot be resumed: raise if everything wasn't downloaded.
63
+ if content_size > curr_file_size:
64
+ raise RuntimeError(
65
+ f"Unable to download {url} to {target}. Please retry later."
66
+ )
67
+
68
+ st = os.stat(target)
69
+ os.chmod(target, st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
70
+
71
+ return target
72
+
73
+
74
+ def _open_urllib(url: str, headers=None):
75
+ import urllib.request
76
+
77
+ # Cloudflare seems to be blocking "User-Agent: Python-urllib/3.9".
78
+ # Use a different one as that must be sorted out.
79
+ use_headers = {"User-Agent": "Mozilla"}
80
+ if headers:
81
+ use_headers.update(headers)
82
+ return urllib.request.urlopen(
83
+ urllib.request.Request(url, headers=use_headers), timeout=20
84
+ )
85
+
86
+
87
+ def _get_file_size(filename: str | Path) -> int:
88
+ # Check if file already exists and get downloaded size (if any)
89
+ file_size = 0
90
+ if os.path.exists(filename):
91
+ with open(filename, "rb") as f:
92
+ file_size = os.fstat(f.fileno()).st_size
93
+ return file_size
94
+
95
+
96
+ def _resume_download(url: str, filename: str | Path, chunk_size: int = 1024):
97
+ """Downloads a file in chunks with resume support.
98
+
99
+ Args:
100
+ url: The URL of the file to download.
101
+ filename: The filename to save the downloaded file.
102
+ chunk_size: The size of each chunk to download (in bytes).
103
+ """
104
+ downloaded_size = _get_file_size(filename)
105
+ # Set headers for resume download
106
+ headers = {}
107
+ if downloaded_size > 0:
108
+ headers["Range"] = f"bytes={downloaded_size}-"
109
+
110
+ with _open_urllib(url, headers) as response, open(filename, "ab") as stream:
111
+ content_size = response.getheader("Content-Length")
112
+
113
+ if not content_size:
114
+ raise RuntimeError("Resuming downloads is not supported.")
115
+
116
+ while True:
117
+ chunk = response.read(chunk_size)
118
+ if not chunk:
119
+ break
120
+ stream.write(chunk)
121
+
122
+
123
+ def _download_rcc():
124
+ """
125
+ Downloads RCC in the place where the action server expects it.
126
+ """
127
+
128
+ if sys.platform == "win32":
129
+ rcc_path = (
130
+ CURDIR
131
+ / "src"
132
+ / "actions"
133
+ / "server"
134
+ / "bin"
135
+ / f"rcc-{RCC_VERSION}.exe"
136
+ )
137
+ else:
138
+ rcc_path = (
139
+ CURDIR / "src" / "actions" / "server" / "bin" / f"rcc-{RCC_VERSION}"
140
+ )
141
+
142
+ machine = platform.machine()
143
+ is_64 = not machine or "64" in machine
144
+
145
+ # Using joshyorko/rcc GitHub releases
146
+ # Asset names: rcc-windows64.exe, rcc-macosarm64, rcc-macos64, rcc-linux64
147
+ if sys.platform == "win32":
148
+ if is_64:
149
+ asset_name = "rcc-windows64.exe"
150
+ else:
151
+ raise RuntimeError("Unsupported platform (windows 32 bits)")
152
+
153
+ elif sys.platform == "darwin":
154
+ if machine == "arm64":
155
+ asset_name = "rcc-macosarm64"
156
+ else:
157
+ asset_name = "rcc-macos64"
158
+
159
+ else:
160
+ if is_64:
161
+ asset_name = "rcc-linux64"
162
+ else:
163
+ raise RuntimeError("Unsupported platform (linux 32 bits)")
164
+
165
+ # GitHub releases URL format
166
+ rcc_url = f"https://github.com/joshyorko/rcc/releases/download/v{RCC_VERSION}/{asset_name}"
167
+
168
+ print(f"Downloading '{rcc_url}' to '{rcc_path}'")
169
+ return _download_with_resume(rcc_url, rcc_path)
170
+
171
+
172
+ def build(*args, **kwarg):
173
+ if os.environ.get("ACTION_SERVER_SKIP_DOWNLOAD_IN_BUILD", "").lower().strip() in (
174
+ "1",
175
+ "true",
176
+ ):
177
+ return
178
+
179
+ _download_rcc()
180
+
181
+
182
+ if __name__ == "__main__":
183
+ build()
@@ -0,0 +1,133 @@
1
+ [tool.poetry]
2
+ name = "actions-runtime"
3
+ version = "1.0.1"
4
+ description = """Community Action Server"""
5
+ authors = [
6
+ "Sema4.ai, Inc. <dev@sema4.ai>",
7
+ "Fabio Z. <fabio@sema4.ai>"
8
+ ]
9
+ readme = "README.md"
10
+ repository = "https://github.com/joshyorko/actions/tree/community"
11
+ license = "Apache-2.0"
12
+ packages = [{ include = "actions", from = "src" }]
13
+ include = [
14
+ "src/actions/server/_static_contents.py",
15
+ "src/actions/server/_oauth2_config.py",
16
+ "src/actions/server/bin/rcc*",
17
+ "src/actions/server/templates/action-templates.zip",
18
+ "src/actions/server/templates/action-templates.yaml",
19
+ ]
20
+ homepage = "https://github.com/joshyorko/actions/tree/community"
21
+
22
+ [tool.poetry.scripts]
23
+ action-server = "actions.server.cli:main"
24
+
25
+
26
+ [tool.poetry.dependencies]
27
+ aiohttp = "^3.13.2"
28
+ fastapi-slim = "^0.121.1"
29
+ jsonschema = "^4.23.0"
30
+ # This one needs a `_fix_jsonschema_specifications` hack
31
+ # See: https://github.com/python-jsonschema/jsonschema-specifications/issues/61
32
+ jsonschema-specifications = "^2024.10.1"
33
+ msgspec = "^0.19"
34
+ psutil = ">=5.0,<8.0"
35
+ pydantic = "^2.12.4"
36
+ pyyaml = "^6.0.3"
37
+ python = ">=3.12,<3.14"
38
+ requests = "^2"
39
+ actions-core = "^1.0.0"
40
+ actions-http-helper = "^1.0.0"
41
+ termcolor = "^3.2.0"
42
+ uvicorn = "^0.38.0"
43
+ websockets = "^15.0.1"
44
+ cryptography = "^46.0.3"
45
+ requests_oauthlib = "^2.0"
46
+ watchfiles = "^1.1.1"
47
+ mcp = "^2.0.0"
48
+ actions-work-items = "^0.4.4"
49
+ # Scheduling dependencies
50
+ croniter = "^2.0.0"
51
+ pytz = "^2024.1"
52
+ aiosmtplib = "^3.0.0"
53
+ # Redis for control-room-lite mode (bundled so it just works)
54
+ redis = "^5.0.0"
55
+ psycopg = { version = "^3.2.0", extras = ["binary"] }
56
+
57
+ [tool.poetry.group.dev.dependencies]
58
+ actions-local-devutils = { path = "../devutils/", develop = true }
59
+ httpx = "^0.28.1"
60
+ types-requests = "^2"
61
+ types-PyYAML = "^6"
62
+ robocorp-log-pytest = "^0.0.5"
63
+ types-psutil = "^7"
64
+ types-jsonschema = "^4.22.0"
65
+ pyinstaller = "6.16.0"
66
+ pyinstaller-hooks-contrib = "2025.9"
67
+
68
+ [tool.mypy]
69
+ mypy_path = "src:tests"
70
+
71
+ [tool.black]
72
+ skip-string-normalization = false
73
+ skip-magic-trailing-comma = false
74
+
75
+ [tool.isort]
76
+ profile = "black"
77
+
78
+ [build-system]
79
+ requires = ["poetry-core", "setuptools"]
80
+ build-backend = "poetry.core.masonry.api"
81
+
82
+ [tool.poetry.build]
83
+ script = "build.py"
84
+ generate-setup-file = true
85
+
86
+ [tool.pytest.ini_options]
87
+ norecursedirs = "tests/action_server_tests/test_devenv/* dist build build-binary"
88
+ testpaths = ["tests"]
89
+ markers = [
90
+ "real_rcc: gated real RCC Environment Artifact execution proof",
91
+ "postgresql: requires a PostgreSQL service",
92
+ ]
93
+ filterwarnings = [
94
+ "ignore:ast.Str is deprecated.*:DeprecationWarning:robocorp\\.log\\._ast_utils",
95
+ "ignore:ast.Str is deprecated.*:DeprecationWarning:robocorp\\.log\\._rewrite_ast_add_callbacks",
96
+ "ignore:Attribute s is deprecated.*:DeprecationWarning:robocorp\\.log\\._rewrite_ast_add_callbacks",
97
+ ]
98
+
99
+ # This is for backward compatibility.
100
+ [[tool.mypy.overrides]]
101
+ module = "robocorp.actions.*"
102
+ ignore_missing_imports = true
103
+
104
+ # Ignore missing build system modules (tests for unimplemented features)
105
+ [[tool.mypy.overrides]]
106
+ module = [
107
+ "tree_shaker",
108
+ "tier_selector",
109
+ "artifact_validator",
110
+ "build_artifact",
111
+ "package_resolver",
112
+ "package_manifest"
113
+ ]
114
+ ignore_missing_imports = true
115
+
116
+ [[tool.mypy.overrides]]
117
+ module = "robocorp.tasks.*"
118
+ ignore_missing_imports = true
119
+
120
+ [[tool.mypy.overrides]]
121
+ module = [
122
+ "actions.server._oauth2_config",
123
+ "actions.server._static_contents",
124
+ "croniter",
125
+ "cronstrue",
126
+ "pytz",
127
+ ]
128
+ ignore_missing_imports = true
129
+
130
+
131
+ [tool.robocorp.log]
132
+ default_library_filter_kind = "exclude"
133
+ log_filter_rules = [{ name = "sema4ai", kind = "full_log" }]
@@ -0,0 +1,82 @@
1
+ # -*- coding: utf-8 -*-
2
+ from setuptools import setup
3
+
4
+ package_dir = \
5
+ {'': 'src'}
6
+
7
+ packages = \
8
+ ['actions',
9
+ 'actions.server',
10
+ 'actions.server._build_common',
11
+ 'actions.server._common',
12
+ 'actions.server._common.action_package_handling',
13
+ 'actions.server._common.package_deps',
14
+ 'actions.server._common.package_deps.conda_impl',
15
+ 'actions.server._common.package_deps.pip_impl',
16
+ 'actions.server._common.termcolors',
17
+ 'actions.server._preload_actions',
18
+ 'actions.server._robo_utils',
19
+ 'actions.server.env',
20
+ 'actions.server.mcp',
21
+ 'actions.server.migrations',
22
+ 'actions.server.package',
23
+ 'actions.server.vendored_deps',
24
+ 'actions.server.vendored_deps.action_package_handling',
25
+ 'actions.server.vendored_deps.package_deps',
26
+ 'actions.server.vendored_deps.package_deps.conda_impl',
27
+ 'actions.server.vendored_deps.package_deps.pip_impl',
28
+ 'actions.server.vendored_deps.termcolors']
29
+
30
+ package_data = \
31
+ {'': ['*'], 'actions.server': ['bin/*', 'templates/*', 'templates/zips/*']}
32
+
33
+ install_requires = \
34
+ ['actions-core>=1.0.0,<2.0.0',
35
+ 'actions-http-helper>=1.0.0,<2.0.0',
36
+ 'actions-work-items>=0.4.4,<0.5.0',
37
+ 'aiohttp>=3.13.2,<4.0.0',
38
+ 'aiosmtplib>=3.0.0,<4.0.0',
39
+ 'croniter>=2.0.0,<3.0.0',
40
+ 'cryptography>=46.0.3,<47.0.0',
41
+ 'fastapi-slim>=0.121.1,<0.122.0',
42
+ 'jsonschema-specifications>=2024.10.1,<2025.0.0',
43
+ 'jsonschema>=4.23.0,<5.0.0',
44
+ 'mcp>=2.0.0,<3.0.0',
45
+ 'msgspec>=0.19,<0.20',
46
+ 'psutil>=5.0,<8.0',
47
+ 'psycopg[binary]>=3.2.0,<4.0.0',
48
+ 'pydantic>=2.12.4,<3.0.0',
49
+ 'pytz>=2024.1,<2025.0',
50
+ 'pyyaml>=6.0.3,<7.0.0',
51
+ 'redis>=5.0.0,<6.0.0',
52
+ 'requests>=2,<3',
53
+ 'requests_oauthlib>=2.0,<3.0',
54
+ 'termcolor>=3.2.0,<4.0.0',
55
+ 'uvicorn>=0.38.0,<0.39.0',
56
+ 'watchfiles>=1.1.1,<2.0.0',
57
+ 'websockets>=15.0.1,<16.0.0']
58
+
59
+ entry_points = \
60
+ {'console_scripts': ['action-server = actions.server.cli:main']}
61
+
62
+ setup_kwargs = {
63
+ 'name': 'actions-runtime',
64
+ 'version': '1.0.1',
65
+ 'description': 'Community Action Server',
66
+ 'long_description': "# actions-runtime\n\n[Sema4.ai Action Server](https://github.com/sema4ai/actions#readme) is a Python framework designed to provide your Python functions to AI Agents. It works both as an MCP Server (hosting tools, resources and prompts) and also provides an OpenAPI compatible API.\n\nA `tool` or `action` in this case is defined as a Python function (which has inputs/outputs defined), which is served by the `Sema4.ai Action Server`.\n\nThe `Sema4.ai Action Server` automatically provides a `/mcp` endpoint for connecting `MCP` clients and also generates an OpenAPI spec for your Python code, enabling different AI/LLM Agents to understand and call your Action. It also manages the Action lifecycle and provides full traceability of what happened during any tool or action call (open the `/runs` endpoint in a browser to see not only inputs and output, but also a full `log.html` with internal details, such as variables and function calls that your Python function executed).\n\n## 1. Install Action Server\n\nAction Server is available as a stand-alone fully signed executable and via `pip install actions-runtime`.\n\n> We recommend the executable to prevent confusion in case you have multiple/crowded Python environments, etc.\n\n#### For macOS\n\n```sh\n# Install Actions Runtime\npython -m pip install actions-runtime\n```\n\n#### For Windows\n\n```sh\n# Download Sema4.ai Action Server\ncurl -o action-server.exe https://cdn.sema4.ai/action-server/releases/latest/windows64/action-server.exe\n\n# Add to PATH or move to a folder that is in PATH\nsetx PATH=%PATH%;%CD%\n```\n\n#### For Linux\n\n```sh\n# Download Sema4.ai Action Server\ncurl -o action-server https://cdn.sema4.ai/action-server/releases/latest/linux64/action-server\nchmod a+x action-server\n\n# Add to PATH or move to a folder that is in PATH\nsudo mv action-server /usr/local/bin/\n```\n\n## 2. Run your first MCP tool\n\n```sh\n# Bootstrap a new project using this template.\n# You'll be prompted for the name of the project (directory):\naction-server new\n\n# Start Action Server\ncd my-project\naction-server start\n```\n\n👉 You should now have an Action Server running locally at: [http://localhost:8080](http://localhost:8080), so open that in your browser and the web UI will guide you further.\n\n### MCP compatibility\n\n`/mcp` supports the MCP `2026-07-28` per-request contract through the Python\nMCP SDK v2. Clients use `server/discover` and then send calls without an\n`initialize`/`initialized` exchange or `Mcp-Session-Id`. The legacy `/sse`\nendpoint and initialization/session-era compatibility path are intentionally\nnot provided.\n\n## What do you need in your Action Package\n\nAn `Action Package` is currently defined as a local folder that contains at least one Python file containing an action entry point (a Python function marked with `@action` -decorator from `actions`).\n\nThe `package.yaml` file is required for specifying the Python environment and dependencies for your Action ([RCC](https://github.com/joshyorko/rcc/) will be used to automatically bootstrap it and keep it updated given the `package.yaml` contents).\n\n> Note: the `package.yaml` is optional if the action server is not being used as a standalone (i.e.: if it was pip-installed it can use the same python environment where it's installed).\n\n### Community RCC Fork\n\nThis Action Server uses the **joshyorko/rcc v18.19.3** community fork, which provides:\n- **Faster startup** - no proprietary cloud service calls\n- **Official sources** - downloads micromamba directly from conda-forge instead of Robocorp CDN\n- **Decoupled infrastructure** - works fully offline after initial environment bootstrap\n- **Security hardening** - includes upstream archive extraction and TLS fixes, built with Go 1.25.7\n\nEnvironment caching means subsequent startups are near-instant once the holotree is built.\n\n### Bootstrapping a new Action\n\nStart new projects with:\n\n`action-server new`\n\nNote: the `action-server` executable should be automatically added to your Python installation after `pip install actions-runtime`; if it was not, use `python -m actions.server` instead.\n\nAfter creating the project, it's possible to serve the actions under the current directory with:\n\n`action-server start`\n\nFor example: When running `action-server start`, the action server will scan for existing actions under the current directory, and it'll start serving those.\n\nAfter it's started, it's possible to access the following URLs:\n\n- `/index.html`: UI for the Action Server.\n- `/openapi.json`: Provides the openapi spec for the action server.\n- `/docs`: Provides access to the APIs available in the server and a UI to test it.\n\n## Documentation\n\nExplore our [docs](https://github.com/sema4ai/actions/tree/master/action_server/docs) for extensive documentation.\n\n## Changelog\n\nClean-break Actions Runtime releases and `actions-runtime-*` tags use the\n[Actions Runtime changelog](./docs/ACTIONS_RUNTIME_CHANGELOG.md). The historical\n[Action Server changelog](https://github.com/sema4ai/actions/blob/master/action_server/docs/CHANGELOG.md)\nis retained for the older `action-server-v1.2.x` delivery line.\n",
67
+ 'author': 'Sema4.ai, Inc.',
68
+ 'author_email': 'dev@sema4.ai',
69
+ 'maintainer': 'None',
70
+ 'maintainer_email': 'None',
71
+ 'url': 'https://github.com/joshyorko/actions/tree/community',
72
+ 'package_dir': package_dir,
73
+ 'packages': packages,
74
+ 'package_data': package_data,
75
+ 'install_requires': install_requires,
76
+ 'entry_points': entry_points,
77
+ 'python_requires': '>=3.12,<3.14',
78
+ }
79
+ from build import *
80
+ build(setup_kwargs)
81
+
82
+ setup(**setup_kwargs)