science.toml¶
The project configuration file. Its presence marks the project root: every command searches upward from the current directory until it finds one.
[project]
name = "kepler-exoplanets"
[tools.local]
path = "./tools"
[run]
node_timeout_s = 120
max_optimize_iterations = 5
[project]¶
| Key | Type | Default | Meaning |
|---|---|---|---|
name |
string | "research" |
Project name, used in reports. |
[tools.<name>]¶
Each [tools.*] table declares one tool provider. The table name becomes the
provider prefix in qualified tool names (local.power_law_fit,
pubchem.get_compound_by_name).
Three kinds, distinguished by which key is present:
| Key | Type | Meaning |
|---|---|---|
path |
string | Directory of .py files, relative to the project root. |
Every public top-level function in every .py file becomes a tool. The
docstring is the description and the type hints are the schema.
| Key | Type | Meaning |
|---|---|---|
command |
string | Command line, split shell-style, launched as a subprocess. |
| Key | Type | Meaning |
|---|---|---|
url |
string | Endpoint of the MCP server. |
token_env |
string | Name of an environment variable holding the bearer token. |
Never put the secret in this file. If token_env is set and the variable
is empty, the registry raises rather than proceeding unauthenticated.
Any number of providers may be declared, and none is required.
[run]¶
| Key | Type | Default (template) | Meaning |
|---|---|---|---|
node_timeout_s |
integer | 900 |
How long a single node may take before it is abandoned. |
max_optimize_iterations |
integer | 5 |
How many improvement attempts before the optimiser stops and reports honestly that the target was not reached. |
The Kepler example lowers node_timeout_s to 120, because a query that
takes two minutes has failed.
The template, in full¶
science-adk init writes this:
[project]
name = "research"
# ── Tools ────────────────────────────────────────────────────────────────────
# Agents call tools by name. Three kinds of provider, and none is required —
# a project with only local tools is complete, offline and dependency-free.
# Your own Python functions. Every public function in tools/*.py becomes a
# tool; its docstring is the description and its signature is the schema.
[tools.local]
path = "./tools"
# Any MCP server, launched as a subprocess.
# [tools.pubchem]
# command = "uvx mcp-pubchem"
# Any MCP server reachable over HTTP.
# [tools.remote]
# url = "https://example.org/mcp"
# token_env = "SCIENCE_ADK_TOOLS_TOKEN" # read from the environment, never stored here
# ── Execution ────────────────────────────────────────────────────────────────
[run]
# How long a single node may take before it is abandoned.
node_timeout_s = 900
# How many improvement attempts before the optimizer stops and reports honestly
# that the target was not reached.
max_optimize_iterations = 5
Checking it¶
science-adk tools # every provider that loaded, and its tools
science-adk status # the project as the CLI sees it
A provider that fails to load warns rather than aborting: