maltego-transforms 1.0.0__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 (149) hide show
  1. maltego_transforms-1.0.0/LICENSE +21 -0
  2. maltego_transforms-1.0.0/PKG-INFO +189 -0
  3. maltego_transforms-1.0.0/README.md +136 -0
  4. maltego_transforms-1.0.0/pyproject.toml +133 -0
  5. maltego_transforms-1.0.0/src/maltego/_cli.py +443 -0
  6. maltego_transforms-1.0.0/src/maltego/_helper.py +64 -0
  7. maltego_transforms-1.0.0/src/maltego/auth/__init__.py +51 -0
  8. maltego_transforms-1.0.0/src/maltego/auth/claims.py +36 -0
  9. maltego_transforms-1.0.0/src/maltego/auth/dependency.py +480 -0
  10. maltego_transforms-1.0.0/src/maltego/auth/identity.py +110 -0
  11. maltego_transforms-1.0.0/src/maltego/auth/jwt_validator.py +236 -0
  12. maltego_transforms-1.0.0/src/maltego/auth/oidc_validator.py +118 -0
  13. maltego_transforms-1.0.0/src/maltego/auth/problem.py +198 -0
  14. maltego_transforms-1.0.0/src/maltego/auth/saml_validator.py +557 -0
  15. maltego_transforms-1.0.0/src/maltego/auth/settings.py +733 -0
  16. maltego_transforms-1.0.0/src/maltego/auth/validator.py +125 -0
  17. maltego_transforms-1.0.0/src/maltego/config.py +102 -0
  18. maltego_transforms-1.0.0/src/maltego/middlewares/middlewares.py +79 -0
  19. maltego_transforms-1.0.0/src/maltego/middlewares/oauth_middleware.py +213 -0
  20. maltego_transforms-1.0.0/src/maltego/middlewares/shared_settings_middleware.py +81 -0
  21. maltego_transforms-1.0.0/src/maltego/middlewares/user_concurrency_limit_middleware.py +113 -0
  22. maltego_transforms-1.0.0/src/maltego/middlewares/verify_metadata_middleware.py +72 -0
  23. maltego_transforms-1.0.0/src/maltego/model/__init__.py +113 -0
  24. maltego_transforms-1.0.0/src/maltego/model/context.py +678 -0
  25. maltego_transforms-1.0.0/src/maltego/model/entity/__init__.py +1675 -0
  26. maltego_transforms-1.0.0/src/maltego/model/entity/config.py +231 -0
  27. maltego_transforms-1.0.0/src/maltego/model/entity/constants.py +86 -0
  28. maltego_transforms-1.0.0/src/maltego/model/entity/display_info.py +26 -0
  29. maltego_transforms-1.0.0/src/maltego/model/entity/property.py +369 -0
  30. maltego_transforms-1.0.0/src/maltego/model/entity/type_handling.py +36 -0
  31. maltego_transforms-1.0.0/src/maltego/model/event.py +329 -0
  32. maltego_transforms-1.0.0/src/maltego/model/exception.py +182 -0
  33. maltego_transforms-1.0.0/src/maltego/model/graph.py +656 -0
  34. maltego_transforms-1.0.0/src/maltego/model/icon.py +9 -0
  35. maltego_transforms-1.0.0/src/maltego/model/input_constraints/__init__.py +35 -0
  36. maltego_transforms-1.0.0/src/maltego/model/input_constraints/base.py +288 -0
  37. maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/__init__.py +13 -0
  38. maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/composite.py +60 -0
  39. maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/property.py +81 -0
  40. maltego_transforms-1.0.0/src/maltego/model/input_constraints/entity/type.py +42 -0
  41. maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/__init__.py +25 -0
  42. maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/composite.py +64 -0
  43. maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/equals.py +336 -0
  44. maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/match.py +330 -0
  45. maltego_transforms-1.0.0/src/maltego/model/input_constraints/property/regex.py +221 -0
  46. maltego_transforms-1.0.0/src/maltego/model/link.py +369 -0
  47. maltego_transforms-1.0.0/src/maltego/model/machine.py +59 -0
  48. maltego_transforms-1.0.0/src/maltego/model/oauth.py +155 -0
  49. maltego_transforms-1.0.0/src/maltego/model/observer.py +53 -0
  50. maltego_transforms-1.0.0/src/maltego/model/prompt.py +305 -0
  51. maltego_transforms-1.0.0/src/maltego/model/server.py +952 -0
  52. maltego_transforms-1.0.0/src/maltego/model/transform/__init__.py +955 -0
  53. maltego_transforms-1.0.0/src/maltego/model/transform/setting.py +420 -0
  54. maltego_transforms-1.0.0/src/maltego/model/transform_input_annotation.py +322 -0
  55. maltego_transforms-1.0.0/src/maltego/model/transform_set.py +8 -0
  56. maltego_transforms-1.0.0/src/maltego/model/types.py +342 -0
  57. maltego_transforms-1.0.0/src/maltego/pagination/__init__.py +10 -0
  58. maltego_transforms-1.0.0/src/maltego/pagination/cursor_based_paginator.py +55 -0
  59. maltego_transforms-1.0.0/src/maltego/pagination/offset_limit_paginator.py +119 -0
  60. maltego_transforms-1.0.0/src/maltego/pagination/page_based_paginator.py +95 -0
  61. maltego_transforms-1.0.0/src/maltego/pagination/pagination.py +677 -0
  62. maltego_transforms-1.0.0/src/maltego/protocol/__init__.py +0 -0
  63. maltego_transforms-1.0.0/src/maltego/protocol/v3/__init__.py +0 -0
  64. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/__init__.py +16 -0
  65. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/auth.py +23 -0
  66. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/capability.py +16 -0
  67. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/entity.py +71 -0
  68. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/hub_item.py +21 -0
  69. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/icon.py +19 -0
  70. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/machine.py +26 -0
  71. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/seed.py +19 -0
  72. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/status.py +15 -0
  73. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/transform.py +71 -0
  74. maltego_transforms-1.0.0/src/maltego/protocol/v3/discovery/transform_set.py +12 -0
  75. maltego_transforms-1.0.0/src/maltego/protocol/v3/error.py +13 -0
  76. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/__init__.py +0 -0
  77. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/entity.py +46 -0
  78. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/graph.py +13 -0
  79. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/link.py +17 -0
  80. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/metadata.py +12 -0
  81. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/property.py +21 -0
  82. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/transform_run.py +208 -0
  83. maltego_transforms-1.0.0/src/maltego/protocol/v3/execution/ui_message.py +25 -0
  84. maltego_transforms-1.0.0/src/maltego/py.typed +0 -0
  85. maltego_transforms-1.0.0/src/maltego/runner/__init__.py +477 -0
  86. maltego_transforms-1.0.0/src/maltego/runner/transform_execution_context.py +620 -0
  87. maltego_transforms-1.0.0/src/maltego/runner/transform_result_set.py +261 -0
  88. maltego_transforms-1.0.0/src/maltego/server/__init__.py +1578 -0
  89. maltego_transforms-1.0.0/src/maltego/server/capability_matrix.py +432 -0
  90. maltego_transforms-1.0.0/src/maltego/server/etag_middleware.py +22 -0
  91. maltego_transforms-1.0.0/src/maltego/server/tracing_middleware.py +71 -0
  92. maltego_transforms-1.0.0/src/maltego/server/util.py +96 -0
  93. maltego_transforms-1.0.0/src/maltego/server/v3/__init__.py +1611 -0
  94. maltego_transforms-1.0.0/src/maltego/server/version.py +2 -0
  95. maltego_transforms-1.0.0/src/maltego/skills_assets/README.md +1 -0
  96. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-basics/SKILL.md +27 -0
  97. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-basics/references/transform-authoring-patterns.md +257 -0
  98. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-build/SKILL.md +173 -0
  99. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-design/SKILL.md +80 -0
  100. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-design/references/standard-entity-selection.md +148 -0
  101. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-discover/SKILL.md +91 -0
  102. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-discover/references/direct-server-discovery.md +189 -0
  103. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-discover/scripts/discover_server.py +97 -0
  104. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-docs/SKILL.md +54 -0
  105. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-docs/references/docs-routing.md +58 -0
  106. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-skill-index/SKILL.md +60 -0
  107. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/SKILL.md +214 -0
  108. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/references/testing-and-parity.md +300 -0
  109. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/scripts/README.md +29 -0
  110. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transform-test/scripts/sdk_project_check.py +283 -0
  111. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-transforms/SKILL.md +53 -0
  112. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/SKILL.md +244 -0
  113. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/references/trx-to-sdk-mapping.md +177 -0
  114. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/scripts/README.md +42 -0
  115. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-implementer/scripts/trx_to_sdk_candidates.py +223 -0
  116. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/SKILL.md +230 -0
  117. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/known-trx-examples.md +96 -0
  118. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/standard-entity-selection.md +148 -0
  119. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/trx-risk-taxonomy.md +142 -0
  120. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/references/trx-to-sdk-mapping.md +177 -0
  121. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/README.md +76 -0
  122. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/std_entity_lookup.py +142 -0
  123. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/trx_contract.py +312 -0
  124. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/trx_inventory.py +297 -0
  125. maltego_transforms-1.0.0/src/maltego/skills_assets/maltego-trx-migration-planner/scripts/trx_migration_report.py +222 -0
  126. maltego_transforms-1.0.0/src/maltego/template_dir/README.md +105 -0
  127. maltego_transforms-1.0.0/src/maltego/template_dir/__init__.py +0 -0
  128. maltego_transforms-1.0.0/src/maltego/template_dir/project.py +34 -0
  129. maltego_transforms-1.0.0/src/maltego/template_dir/requirements.txt +2 -0
  130. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/__init__.py +0 -0
  131. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/entity_features_example.py +217 -0
  132. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/error_handling_example.py +206 -0
  133. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/input_constraints_example.py +262 -0
  134. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/logging_example.py +120 -0
  135. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/middleware_example.py +197 -0
  136. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/pagination_example.py +325 -0
  137. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/prompts_example.py +373 -0
  138. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/quickstart_example.py +349 -0
  139. maltego_transforms-1.0.0/src/maltego/template_dir/transforms/transform_settings_example.py +481 -0
  140. maltego_transforms-1.0.0/src/maltego/template_minimal_dir/README.md +84 -0
  141. maltego_transforms-1.0.0/src/maltego/template_minimal_dir/__init__.py +1 -0
  142. maltego_transforms-1.0.0/src/maltego/template_minimal_dir/project.py +21 -0
  143. maltego_transforms-1.0.0/src/maltego/template_minimal_dir/requirements.txt +2 -0
  144. maltego_transforms-1.0.0/src/maltego/template_minimal_dir/transforms/__init__.py +1 -0
  145. maltego_transforms-1.0.0/src/maltego/tracing/__init__.py +133 -0
  146. maltego_transforms-1.0.0/src/maltego/util/__init__.py +568 -0
  147. maltego_transforms-1.0.0/src/maltego/util/collections_utils.py +8 -0
  148. maltego_transforms-1.0.0/src/maltego/util/trace_context.py +3 -0
  149. maltego_transforms-1.0.0/src/maltego/util/typing.py +23 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Maltego Technologies GmbH
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,189 @@
1
+ Metadata-Version: 2.3
2
+ Name: maltego-transforms
3
+ Version: 1.0.0
4
+ Summary: Maltego Transform development framework with async support and standalone Transform server
5
+ License: MIT
6
+ Keywords: maltego,osint,transforms,sdk,graph
7
+ Author: Maltego Technologies GmbH
8
+ Requires-Python: >=3.10,<3.15
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
+ Provides-Extra: tracing
20
+ Requires-Dist: Pillow (>=12.3.0,<13.0.0)
21
+ Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
22
+ Requires-Dist: authlib (>=1.6.11,<1.7.0)
23
+ Requires-Dist: cachetools (>=6.1.0,<7.0.0)
24
+ Requires-Dist: cryptography (>=48.0.1,<49.0.0)
25
+ Requires-Dist: fastapi (>=0.137.1,<0.138.0)
26
+ Requires-Dist: fastapi-restful (>=0.5,<0.6)
27
+ Requires-Dist: frozenlist (>=1.4.1,<2.0.0)
28
+ Requires-Dist: httpx (>=0.27.2,<0.28.0)
29
+ Requires-Dist: idna (>=3.15,<4.0)
30
+ Requires-Dist: joserfc (>=1.6.8,<2.0.0)
31
+ Requires-Dist: markdown (>=3.4.0,<4.0.0)
32
+ Requires-Dist: nh3 (>=0.3.6,<0.4.0)
33
+ Requires-Dist: opentelemetry-api (>=1.26,<2.0) ; extra == "tracing"
34
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (>=1.26,<2.0) ; extra == "tracing"
35
+ Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.47b0,<1.0) ; extra == "tracing"
36
+ Requires-Dist: opentelemetry-propagator-b3 (>=1.26,<2.0) ; extra == "tracing"
37
+ Requires-Dist: opentelemetry-sdk (>=1.26,<2.0) ; extra == "tracing"
38
+ Requires-Dist: packaging (>=25.0,<26.0)
39
+ Requires-Dist: pycryptodome (>=3.20,<4.0)
40
+ Requires-Dist: pydantic (>=2.13,<3.0)
41
+ Requires-Dist: pydantic-settings (>=2.1,<3.0)
42
+ Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
43
+ Requires-Dist: signxml (>=4.4.0,<5.0.0)
44
+ Requires-Dist: starlette (>=1.3.1,<2.0.0)
45
+ Requires-Dist: typing-extensions (>=4.9,<5.0)
46
+ Requires-Dist: typing-inspect (>=0.9,<0.10)
47
+ Requires-Dist: uvicorn (>=0.35.0,<0.36.0)
48
+ Project-URL: Documentation, https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview
49
+ Project-URL: Homepage, https://github.com/MaltegoTech/maltego-transforms
50
+ Project-URL: Repository, https://github.com/MaltegoTech/maltego-transforms
51
+ Description-Content-Type: text/markdown
52
+
53
+ # maltego-transforms
54
+
55
+ **The Python SDK for building Maltego transform servers.**
56
+
57
+ <!-- Badges activate once the repo goes public and the ci.yml workflow lands; they won't render against a private repo. -->
58
+ ![Tests](https://github.com/MaltegoTech/maltego-transforms/actions/workflows/ci.yml/badge.svg)
59
+ ![PyPI](https://img.shields.io/pypi/v/maltego-transforms.svg)
60
+ ![Python](https://img.shields.io/pypi/pyversions/maltego-transforms.svg)
61
+ ![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)
62
+ <!-- ![Coverage](https://codecov.io/gh/MaltegoTech/maltego-transforms/branch/main/graph/badge.svg) — add once Codecov is configured -->
63
+
64
+ ---
65
+
66
+ A **transform** takes one or more Maltego entities as input — an IP address, a domain, a person, a document, or your own custom object — and returns related entities as output. Transforms are how Maltego expands a graph, and `maltego-transforms` is the fastest way to write and run your own.
67
+
68
+ ## Install
69
+
70
+ ```bash
71
+ pip install maltego-transforms
72
+ ```
73
+
74
+ Requires Python `>=3.10,<3.15`.
75
+
76
+ ## Your first transform
77
+
78
+ ```python
79
+ from maltego.server import (
80
+ MaltegoContext,
81
+ MaltegoEntity,
82
+ MaltegoServerSettings,
83
+ register_transform,
84
+ run_server,
85
+ setup,
86
+ )
87
+
88
+
89
+ @register_transform(
90
+ display_name="Hello World [My Transforms]",
91
+ transform_set="My Transforms",
92
+ )
93
+ async def hello_world(
94
+ input_entity: MaltegoEntity,
95
+ context: MaltegoContext,
96
+ ) -> MaltegoEntity:
97
+ context.log.inform(f"Hello from {context.remote_ip}")
98
+ return MaltegoEntity["maltego.Phrase"](f"Hello, {input_entity.value}") # type: ignore
99
+
100
+
101
+ if __name__ == "__main__":
102
+ settings = MaltegoServerSettings(
103
+ server_name="My Transform Server",
104
+ ns="my.transforms",
105
+ author="i@example.com",
106
+ )
107
+ setup(settings)
108
+ run_server(settings=settings, ssl=False) # plain HTTP for local development
109
+ ```
110
+
111
+ Save this as `project.py` and run it:
112
+
113
+ ```bash
114
+ python project.py
115
+ ```
116
+
117
+ This starts a local HTTP server on `127.0.0.1:3000`, serving a seed URL at `/seed`. Add that URL to Maltego to discover and install your transforms. SSL is on by default for anything beyond local dev — see [HTTPS, Certificates, and Browser Trust](https://docs.maltego.com/en/support/solutions/articles/15000062366-https-certificates-and-browser-trust), which the Graph Browser client requires.
118
+
119
+ Prefer a ready-made project over a blank file?
120
+
121
+ ```bash
122
+ maltego-transforms start my_project
123
+ cd my_project
124
+ python -m venv .venv && source .venv/bin/activate
125
+ pip install -r requirements.txt
126
+ python project.py
127
+ ```
128
+
129
+ This scaffolds a runnable project with example transforms covering the most common patterns.
130
+
131
+ ## Runbooks
132
+
133
+ Repository runbooks live in [`runbooks/`](runbooks/) and capture repeatable
134
+ workflows for contributors and coding agents, including writing PRPs for
135
+ non-trivial changes and choosing the right test command.
136
+
137
+ ## Features
138
+
139
+ - **Decorator-based registration** — `@register_transform` turns any function into a discoverable transform
140
+ - **Typed input and output** — plain Python type hints; the SDK infers and validates entity types for you
141
+ - **Async and streaming** — write `async def` transforms, or use `AsyncGenerator` to stream results as they're found
142
+ - **OAuth** — built-in support for OAuth-authenticated transforms
143
+ - **Transform settings** — expose configurable options (API keys, limits, toggles) that users fill in from the Maltego client
144
+ - **Input constraints** — control which entities a transform is even offered for, before it runs
145
+ - **Middlewares** — hook into the request/response lifecycle for logging, auth, or shared setup
146
+
147
+ ## Standard entities
148
+
149
+ Want typed entity classes instead of raw dictionaries? [`maltego-transforms-std-entities`](https://docs.maltego.com/en/support/solutions/articles/15000062357-standard-entities-overview) ships ready-made classes like `Person`, `DNSName`, and `IPv4Address`:
150
+
151
+ ```bash
152
+ pip install maltego-transforms-std-entities
153
+ ```
154
+
155
+ ```python
156
+ from maltego.entities import DNSName, IPv4Address
157
+ from maltego.server import register_transform
158
+
159
+ @register_transform
160
+ async def dns_to_ip(input_entity: DNSName) -> IPv4Address:
161
+ return IPv4Address("1.1.1.1")
162
+ ```
163
+
164
+ ## Building with an AI coding agent
165
+
166
+ Scaffold a project with agent skills for authoring and testing transforms:
167
+
168
+ ```bash
169
+ maltego-transforms start my-project --with-skills
170
+ ```
171
+
172
+ This drops a skill index into `.agents/skills/` that points your coding agent at the right focused skill for the task at hand — building a new transform, migrating an existing one, or debugging discovery. See [Using AI Agent Skills with the SDK](https://docs.maltego.com/en/support/solutions/articles/15000062361-using-ai-agent-skills-with-the-sdk) for details.
173
+
174
+ ## Documentation
175
+
176
+ Full docs — configuration, authentication, entity modeling, pagination, and the complete API reference — start at the **[Maltego Transforms SDK overview](https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview)**.
177
+
178
+ ## Support
179
+
180
+ Questions or issues? Reach out through the [Maltego Support Portal](https://support.maltego.com/) or your Maltego account contact.
181
+
182
+ ## Contributing
183
+
184
+ Contributions are welcome — see [`CONTRIBUTING.md`](CONTRIBUTING.md) for guidelines.
185
+
186
+ ## License
187
+
188
+ `maltego-transforms` is licensed under the [MIT License](LICENSE).
189
+
@@ -0,0 +1,136 @@
1
+ # maltego-transforms
2
+
3
+ **The Python SDK for building Maltego transform servers.**
4
+
5
+ <!-- Badges activate once the repo goes public and the ci.yml workflow lands; they won't render against a private repo. -->
6
+ ![Tests](https://github.com/MaltegoTech/maltego-transforms/actions/workflows/ci.yml/badge.svg)
7
+ ![PyPI](https://img.shields.io/pypi/v/maltego-transforms.svg)
8
+ ![Python](https://img.shields.io/pypi/pyversions/maltego-transforms.svg)
9
+ ![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)
10
+ <!-- ![Coverage](https://codecov.io/gh/MaltegoTech/maltego-transforms/branch/main/graph/badge.svg) — add once Codecov is configured -->
11
+
12
+ ---
13
+
14
+ A **transform** takes one or more Maltego entities as input — an IP address, a domain, a person, a document, or your own custom object — and returns related entities as output. Transforms are how Maltego expands a graph, and `maltego-transforms` is the fastest way to write and run your own.
15
+
16
+ ## Install
17
+
18
+ ```bash
19
+ pip install maltego-transforms
20
+ ```
21
+
22
+ Requires Python `>=3.10,<3.15`.
23
+
24
+ ## Your first transform
25
+
26
+ ```python
27
+ from maltego.server import (
28
+ MaltegoContext,
29
+ MaltegoEntity,
30
+ MaltegoServerSettings,
31
+ register_transform,
32
+ run_server,
33
+ setup,
34
+ )
35
+
36
+
37
+ @register_transform(
38
+ display_name="Hello World [My Transforms]",
39
+ transform_set="My Transforms",
40
+ )
41
+ async def hello_world(
42
+ input_entity: MaltegoEntity,
43
+ context: MaltegoContext,
44
+ ) -> MaltegoEntity:
45
+ context.log.inform(f"Hello from {context.remote_ip}")
46
+ return MaltegoEntity["maltego.Phrase"](f"Hello, {input_entity.value}") # type: ignore
47
+
48
+
49
+ if __name__ == "__main__":
50
+ settings = MaltegoServerSettings(
51
+ server_name="My Transform Server",
52
+ ns="my.transforms",
53
+ author="i@example.com",
54
+ )
55
+ setup(settings)
56
+ run_server(settings=settings, ssl=False) # plain HTTP for local development
57
+ ```
58
+
59
+ Save this as `project.py` and run it:
60
+
61
+ ```bash
62
+ python project.py
63
+ ```
64
+
65
+ This starts a local HTTP server on `127.0.0.1:3000`, serving a seed URL at `/seed`. Add that URL to Maltego to discover and install your transforms. SSL is on by default for anything beyond local dev — see [HTTPS, Certificates, and Browser Trust](https://docs.maltego.com/en/support/solutions/articles/15000062366-https-certificates-and-browser-trust), which the Graph Browser client requires.
66
+
67
+ Prefer a ready-made project over a blank file?
68
+
69
+ ```bash
70
+ maltego-transforms start my_project
71
+ cd my_project
72
+ python -m venv .venv && source .venv/bin/activate
73
+ pip install -r requirements.txt
74
+ python project.py
75
+ ```
76
+
77
+ This scaffolds a runnable project with example transforms covering the most common patterns.
78
+
79
+ ## Runbooks
80
+
81
+ Repository runbooks live in [`runbooks/`](runbooks/) and capture repeatable
82
+ workflows for contributors and coding agents, including writing PRPs for
83
+ non-trivial changes and choosing the right test command.
84
+
85
+ ## Features
86
+
87
+ - **Decorator-based registration** — `@register_transform` turns any function into a discoverable transform
88
+ - **Typed input and output** — plain Python type hints; the SDK infers and validates entity types for you
89
+ - **Async and streaming** — write `async def` transforms, or use `AsyncGenerator` to stream results as they're found
90
+ - **OAuth** — built-in support for OAuth-authenticated transforms
91
+ - **Transform settings** — expose configurable options (API keys, limits, toggles) that users fill in from the Maltego client
92
+ - **Input constraints** — control which entities a transform is even offered for, before it runs
93
+ - **Middlewares** — hook into the request/response lifecycle for logging, auth, or shared setup
94
+
95
+ ## Standard entities
96
+
97
+ Want typed entity classes instead of raw dictionaries? [`maltego-transforms-std-entities`](https://docs.maltego.com/en/support/solutions/articles/15000062357-standard-entities-overview) ships ready-made classes like `Person`, `DNSName`, and `IPv4Address`:
98
+
99
+ ```bash
100
+ pip install maltego-transforms-std-entities
101
+ ```
102
+
103
+ ```python
104
+ from maltego.entities import DNSName, IPv4Address
105
+ from maltego.server import register_transform
106
+
107
+ @register_transform
108
+ async def dns_to_ip(input_entity: DNSName) -> IPv4Address:
109
+ return IPv4Address("1.1.1.1")
110
+ ```
111
+
112
+ ## Building with an AI coding agent
113
+
114
+ Scaffold a project with agent skills for authoring and testing transforms:
115
+
116
+ ```bash
117
+ maltego-transforms start my-project --with-skills
118
+ ```
119
+
120
+ This drops a skill index into `.agents/skills/` that points your coding agent at the right focused skill for the task at hand — building a new transform, migrating an existing one, or debugging discovery. See [Using AI Agent Skills with the SDK](https://docs.maltego.com/en/support/solutions/articles/15000062361-using-ai-agent-skills-with-the-sdk) for details.
121
+
122
+ ## Documentation
123
+
124
+ Full docs — configuration, authentication, entity modeling, pagination, and the complete API reference — start at the **[Maltego Transforms SDK overview](https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview)**.
125
+
126
+ ## Support
127
+
128
+ Questions or issues? Reach out through the [Maltego Support Portal](https://support.maltego.com/) or your Maltego account contact.
129
+
130
+ ## Contributing
131
+
132
+ Contributions are welcome — see [`CONTRIBUTING.md`](CONTRIBUTING.md) for guidelines.
133
+
134
+ ## License
135
+
136
+ `maltego-transforms` is licensed under the [MIT License](LICENSE).
@@ -0,0 +1,133 @@
1
+ [build-system]
2
+ requires = ["poetry-core>=1.5.0"]
3
+ build-backend = "poetry.core.masonry.api"
4
+
5
+ [[tool.poetry.source]]
6
+ name = "PyPI"
7
+ priority = "primary"
8
+
9
+ [tool.poetry]
10
+ name = "maltego-transforms"
11
+ version = "1.0.0"
12
+ description = "Maltego Transform development framework with async support and standalone Transform server"
13
+ authors = [
14
+ "Maltego Technologies GmbH",
15
+ ]
16
+ license = "MIT"
17
+ readme = "README.md"
18
+ homepage = "https://github.com/MaltegoTech/maltego-transforms"
19
+ repository = "https://github.com/MaltegoTech/maltego-transforms"
20
+ documentation = "https://docs.maltego.com/en/support/solutions/articles/15000062349-maltego-transforms-sdk-overview"
21
+ keywords = ["maltego", "osint", "transforms", "sdk", "graph"]
22
+ classifiers = [
23
+ "Development Status :: 5 - Production/Stable",
24
+ "Intended Audience :: Developers",
25
+ "License :: OSI Approved :: MIT License",
26
+ "Programming Language :: Python :: 3",
27
+ "Programming Language :: Python :: 3.10",
28
+ "Programming Language :: Python :: 3.11",
29
+ "Programming Language :: Python :: 3.12",
30
+ "Programming Language :: Python :: 3.13",
31
+ "Programming Language :: Python :: 3.14",
32
+ "Topic :: Software Development :: Libraries :: Python Modules",
33
+ ]
34
+ packages = [
35
+ { include = "maltego", from = "src" },
36
+ ]
37
+ # Belt-and-suspenders exclusion of credentials/key material from built artifacts.
38
+ # These globs are evaluated relative to the source tree that poetry packages up; they
39
+ # complement the existing built-artifact assertion tests in src/tests/packaging/.
40
+ exclude = [
41
+ "**/*.key",
42
+ "**/*.pem",
43
+ "**/*.crt",
44
+ "**/.env",
45
+ "**/.env.*",
46
+ ]
47
+
48
+ [tool.poetry.scripts]
49
+ maltego-transforms = 'maltego._cli:execute_from_command_line'
50
+
51
+
52
+ [tool.poetry.dependencies]
53
+ python = ">=3.10,<3.15"
54
+ uvicorn = "^0.35.0"
55
+ fastapi = "^0.137.1"
56
+ aiofiles = "^24.1.0"
57
+ cachetools = "^6.1.0"
58
+ typing-extensions = "^4.9"
59
+ httpx = "^0.27.2"
60
+ python-dateutil = "^2.8.2"
61
+ Pillow = "^12.3.0"
62
+ pycryptodome = "^3.20"
63
+ markdown = "^3.4.0"
64
+ frozenlist = "^1.4.1"
65
+ pydantic = "^2.13"
66
+ fastapi-restful = "^0.5"
67
+ typing-inspect = "^0.9"
68
+ pydantic-settings = "^2.1"
69
+ authlib = ">=1.6.11,<1.7.0"
70
+ packaging = "^25.0"
71
+ cryptography = "^48.0.1"
72
+ joserfc = "^1.6.8"
73
+ signxml = "^4.4.0"
74
+ idna = "^3.15"
75
+ starlette = ">=1.3.1,<2.0.0"
76
+ nh3 = "^0.3.6"
77
+ opentelemetry-api = {version = ">=1.26,<2.0", optional = true}
78
+ opentelemetry-sdk = {version = ">=1.26,<2.0", optional = true}
79
+ opentelemetry-instrumentation-fastapi = {version = ">=0.47b0,<1.0", optional = true}
80
+ opentelemetry-propagator-b3 = {version = ">=1.26,<2.0", optional = true}
81
+ opentelemetry-exporter-otlp-proto-grpc = {version = ">=1.26,<2.0", optional = true}
82
+
83
+ [tool.poetry.extras]
84
+ tracing = [
85
+ "opentelemetry-api",
86
+ "opentelemetry-sdk",
87
+ "opentelemetry-instrumentation-fastapi",
88
+ "opentelemetry-propagator-b3",
89
+ "opentelemetry-exporter-otlp-proto-grpc",
90
+ ]
91
+
92
+ [tool.poetry.group.dev.dependencies]
93
+ pytest = "^8"
94
+ pytest-asyncio = "^0"
95
+ pytest-cov = "^4"
96
+ xmltodict = "^0"
97
+ autopep8 = "^2"
98
+ pylint= "^3"
99
+ mypy = "^1"
100
+ toml = "^0"
101
+ types-aiofiles = "^22"
102
+ types-cachetools = "^5"
103
+ types-certifi = "^2021"
104
+ types-chardet = "^5"
105
+ types-python-dateutil = "^2"
106
+ types-requests = "^2"
107
+ types-markdown = "^3"
108
+ types-xmltodict = "^0"
109
+ types-Pillow = "^9"
110
+ types-toml = "^0"
111
+ syrupy = "^4"
112
+ cyclonedx-bom = "^7.3.0"
113
+ detect-secrets = "^1.5.0"
114
+ pip-audit = "^2.10.1"
115
+ ruff = "^0.14.11"
116
+ pre-commit = "^4.6.0"
117
+ commitizen = "<4.16.4"
118
+
119
+ [tool.commitizen]
120
+ name = "cz_conventional_commits"
121
+ tag_format = "$version"
122
+ version_scheme = "pep440"
123
+ version_provider = "poetry"
124
+ update_changelog_on_bump = true
125
+
126
+ [tool.ruff]
127
+ line-length = 120
128
+
129
+ [tool.ruff.lint]
130
+ ignore = [
131
+ "F403",
132
+ "F405",
133
+ ]