Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion plugins/amplitude/.devin-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
],
"mcpServers": {
"amplitude": {
"url": "https://${AMPLITUDE_MCP_DOMAIN}/mcp"
"url": "https://${AMPLITUDE_MCP_DOMAIN:-mcp.amplitude.com}/mcp"
}
}
}
2 changes: 1 addition & 1 deletion plugins/datadog-remote/.devin-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
],
"mcpServers": {
"datadog-remote": {
"url": "https://${DATADOG_DD_MCP_DOMAIN}/api/unstable/mcp-server/mcp?toolsets=core,apm,dbm,software-delivery&omit_tools=apm_search_spans,apm_search_watchdog_stories,apm_get_watchdog_story,semantic_search_change_stories,apm_search_recommendations,apm_get_recommendation,get_datadog_database_recommendations,optimize_datadog_database_query,update_datadog_flaky_test_states,get_datadog_code_coverage_branch_summary,get_datadog_code_coverage_commit_summary,get_datadog_code_coverage_pr_summary,get_datadog_code_coverage_files,get_datadog_test_optimization_settings,get_datadog_flaky_tests_management_policies,search_dora_deployments,aggregate_dora_deployments,search_dora_events,aggregate_dora_events,retry_datadog_ci_job,search_datadog_test_events,aggregate_datadog_test_events,search_pr_insights,get_dora_fields,get_prs_by_head_branch"
"url": "https://${DATADOG_DD_MCP_DOMAIN:-mcp.datadoghq.com}/api/unstable/mcp-server/mcp?toolsets=core,apm,dbm,software-delivery&omit_tools=apm_search_spans,apm_search_watchdog_stories,apm_get_watchdog_story,semantic_search_change_stories,apm_search_recommendations,apm_get_recommendation,get_datadog_database_recommendations,optimize_datadog_database_query,update_datadog_flaky_test_states,get_datadog_code_coverage_branch_summary,get_datadog_code_coverage_commit_summary,get_datadog_code_coverage_pr_summary,get_datadog_code_coverage_files,get_datadog_test_optimization_settings,get_datadog_flaky_tests_management_policies,search_dora_deployments,aggregate_dora_deployments,search_dora_events,aggregate_dora_events,retry_datadog_ci_job,search_datadog_test_events,aggregate_datadog_test_events,search_pr_insights,get_dora_fields,get_prs_by_head_branch"
}
}
}
2 changes: 1 addition & 1 deletion plugins/datadog/.devin-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
],
"mcpServers": {
"datadog": {
"url": "https://${DATADOG_DD_MCP_DOMAIN}/api/unstable/mcp-server/mcp?toolsets=core,apm,dbm,software-delivery&omit_tools=apm_search_spans,apm_search_watchdog_stories,apm_get_watchdog_story,semantic_search_change_stories,apm_search_recommendations,apm_get_recommendation,get_datadog_database_recommendations,optimize_datadog_database_query,update_datadog_flaky_test_states,get_datadog_code_coverage_branch_summary,get_datadog_code_coverage_commit_summary,get_datadog_code_coverage_pr_summary,get_datadog_code_coverage_files,get_datadog_test_optimization_settings,get_datadog_flaky_tests_management_policies,search_dora_deployments,aggregate_dora_deployments,search_dora_events,aggregate_dora_events,retry_datadog_ci_job,search_datadog_test_events,aggregate_datadog_test_events,search_pr_insights,get_dora_fields,get_prs_by_head_branch",
"url": "https://${DATADOG_DD_MCP_DOMAIN:-mcp.datadoghq.com}/api/unstable/mcp-server/mcp?toolsets=core,apm,dbm,software-delivery&omit_tools=apm_search_spans,apm_search_watchdog_stories,apm_get_watchdog_story,semantic_search_change_stories,apm_search_recommendations,apm_get_recommendation,get_datadog_database_recommendations,optimize_datadog_database_query,update_datadog_flaky_test_states,get_datadog_code_coverage_branch_summary,get_datadog_code_coverage_commit_summary,get_datadog_code_coverage_pr_summary,get_datadog_code_coverage_files,get_datadog_test_optimization_settings,get_datadog_flaky_tests_management_policies,search_dora_deployments,aggregate_dora_deployments,search_dora_events,aggregate_dora_events,retry_datadog_ci_job,search_datadog_test_events,aggregate_datadog_test_events,search_pr_insights,get_dora_fields,get_prs_by_head_branch",
"headers": {
"DD-API-KEY": "${DATADOG_DD_API_KEY}",
"DD-APPLICATION-KEY": "${DATADOG_DD_APPLICATION_KEY}"
Expand Down
2 changes: 1 addition & 1 deletion plugins/newrelic-remote/.devin-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
],
"mcpServers": {
"newrelic-remote": {
"url": "https://${NEWRELIC_MCP_DOMAIN}/mcp/"
"url": "https://${NEWRELIC_MCP_DOMAIN:-mcp.newrelic.com}/mcp/"
}
}
}
2 changes: 1 addition & 1 deletion plugins/newrelic/.devin-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
],
"mcpServers": {
"newrelic": {
"url": "https://${NEWRELIC_MCP_DOMAIN}/mcp/",
"url": "https://${NEWRELIC_MCP_DOMAIN:-mcp.newrelic.com}/mcp/",
"headers": {
"Api-Key": "${NEWRELIC_API_KEY}"
}
Expand Down
11 changes: 9 additions & 2 deletions scripts/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,14 @@ def check_entry(index: int, plugin: object, errors: list[str]) -> None:
errors.append(f"{where}: must be a './plugins/<slug>' string or a pinned upstream object")


def placeholder_name(reference: str) -> str:
# `${NAME:-default}` falls back to `default` when NAME has no saved value.
return reference.split(":-", 1)[0]


def check_placeholders(where: str, value: str, errors: list[str]) -> None:
for name in PLACEHOLDER_RE.findall(value):
for reference in PLACEHOLDER_RE.findall(value):
name = placeholder_name(reference)
if name in RUNTIME_PLACEHOLDERS:
continue
if not CREDENTIAL_NAME_RE.match(name):
Expand All @@ -99,7 +105,8 @@ def check_env_placeholders(where: str, env: dict[str, object], errors: list[str]
for key, value in env.items():
if not isinstance(value, str):
continue
for name in PLACEHOLDER_RE.findall(value):
for reference in PLACEHOLDER_RE.findall(value):
name = placeholder_name(reference)
if name not in RUNTIME_PLACEHOLDERS and name != key:
errors.append(f"{where}: env {key} references ${{{name}}}; a saved credential is matched by the env key, so it must be ${{{key}}}")

Expand Down