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
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ Start the joinly server in the first terminal (note, we are not using `--client`
docker run -p 8000:8000 ghcr.io/joinly-ai/joinly:latest
```

> [!WARNING]
> The joinly MCP server has no authentication and is meant to run locally with a single trusted client. Do not expose it beyond `localhost` or a trusted private network.

While the server is running, start the example client implementation in the second terminal window to connect to it and join a meeting:
```bash
uvx joinly-client --env-file .env <MeetingUrl>
Expand Down
21 changes: 10 additions & 11 deletions joinly/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,27 @@


def _resolve(spec: str | type[T], *, base: str, suffix: str) -> type[T]:
"""Turn direct type, dotted path, or short token into a class object.
"""Turn direct type or short token into a class object.

Discovers paths by convention:
- if `spec` is a type, return it directly.
- if `spec` is a dotted path, import the module and return the class.
- if `spec` is a short token, map to
`<base>.<token_lowercase>.<token_camelcase><suffix>`.
"""
if isinstance(spec, type):
return spec

if "." in spec:
# fully qualified
mod, _, cls = spec.rpartition(".")
msg = f"Invalid component token '{spec}': dotted import paths are not allowed."
raise ImportError(msg)

# short token
if spec.lower().endswith(suffix.lower()):
base_name = spec[: -len(suffix)]
else:
# short token
if spec.lower().endswith(suffix.lower()):
base_name = spec[: -len(suffix)]
else:
base_name = "".join(p.capitalize() for p in re.split(r"[_\- ]+", spec))
mod = f"{base}.{base_name.lower()}"
cls = base_name + suffix
base_name = "".join(p.capitalize() for p in re.split(r"[_\- ]+", spec))
mod = f"{base}.{base_name.lower()}"
cls = base_name + suffix

try:
module = importlib.import_module(mod)
Expand Down
Loading